拓扑排序模板

给定一个 DAG(有向无环图),如果从 \(u\)\(v\) 有边,则认为 \(v\) 依赖于 \(u\)。如果 \(u\)\(v\) 有路径(\(u\) 可达 \(v\)),则称 \(v\) 间接依赖于 \(u\)。我们将图中的顶点以线性方式进行排序,使得对于任何的顶点 \(u\)\(v\) 的有向边 \((u,v)\),都可以有 \(u\)\(v\) 的前面。

拓扑排序的目标是将所有节点排序,使得排在前面的节点不能依赖于排在后面的节点。

int n, m; //结点数和边数
vector<int> G[MAXN]; //存图
int in[MAXN]; // 存储每个结点的入度

//拓扑排序
bool toposort() {
    vector<int> ans;
    queue<int> q;
    //入度为0的点入队
    for (int i = 1; i <= n; i++) {
        if (in[i] == 0) q.push(i);
    }
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        ans.push_back(u);
        for (auto v : G[u]) { //所有邻接点入度减1
            if (--in[v] == 0) { //入度变为0,则入队
                q.push(v);
            }
        }
    }
    if (ans.size() == n) { //不存在环,输出序列
        for (auto i : ans) cout << i << ' ';
        return true;
    }
    else { //存在环
        return false;
    }
}
posted @ 2024-01-26 17:29  狂飙霹雳虎  阅读(81)  评论(0编辑  收藏  举报