拓扑排序模板
给定一个 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;
}
}