【图论】拓扑排序

\((u,v)\) 表示 u 的拓扑序在 v 之前。
因为是先从入度为0的点开始消。

struct Graph {

    static const int MAXN = 2e5 + 10;

    int n;
    vector<int> eout[MAXN];
    int din[MAXN];
    int topo[MAXN];

    void init(int n) {
        this->n = n;
        for(int i = 1; i <= n; ++i) {
            eout[i].clear();
            din[i] = 0;
        }
    }

    void addEdge(int u, int v) {
        eout[u].eb(v);
        ++din[v];
    }

    bool topoSort() {
        int ft = 1, bk = 0;
        for(int i = 1; i <= n; ++i) {
            if(din[i] == 0)
                topo[++bk] = i;
        }
        while(ft <= bk) {
            int u = topo[ft++];
            for(int &v : eout[u]) {
                --din[v];
                if(din[v] == 0)
                    topo[++bk] = v;
            }
        }
        return bk == n;
    }

} G;
posted @ 2021-01-30 01:48  purinliang  阅读(44)  评论(0编辑  收藏  举报