拓扑排序

O(n+m)O(n+m)

数组写法

const int N = 1e5 + 10;
vector<int>edge[N + 1];
int n, m, q[N + 1], d[N + 1];//d记录了每个点一开始的入度
inline void TopoSort() {
    int front = 1, rear = 0;
    for (int i = 1; i <= n; i++) {
        if (!d[i]) q[++rear] = i;
    }
    while (front <= rear) {
        int x = q[front];
        ++front;
        for (auto y : edge[x]) {
            if (--d[y] == 0)
                q[++rear] = y;
        }
    }
    if (rear == n) printf("YES\n");//此时q中记录了一个合法的拓扑序列
    else printf("NO\n");
}

vector写法

字典序最小/最大的拓扑序列

时间复杂度O(nlogn+m)O(nlogn+m)

Last updated