拓扑排序(\(\texttt{toplogical sort}\)):
在有向无环图(\(\texttt{DAG}\))中,将 \(n\) 个节点整理成一组排列,使得对于每一条边 \(u \to v\),\(u\) 在排列中的位置总是在 \(v\) 之前,我们称这样的排列为原图的拓扑序,找出一张图的拓扑序的过程则被称为拓扑排序。
拓扑排序不一定唯一。
实现:
-
统计所有节点的入度 \(in_u\),并将 \(in_u=0\) 的节点丢入队列;
-
循环输出队首弹出,并将其指向的所有节点的入度 \(-1\),若入度为 \(0\) 了则继续丢入队列;
-
最后,若队列弹出的节点数不足 \(n\) 个,则原图无拓扑序(因为有环)。
时间复杂度是 \(O(n+m)\) 的。
void topo_sort(){
queue<int> q;
for(int i=1;i<=n;i++)
if(!in[i]) q.push(i);
while(!q.empty()){
int cur=q.front();
cout<<cur<<'\n',q.pop();
for(auto i:G[cur]){
in[i]--;
if(!in[i]) q.push(i);
}
}
}
没有例题(悲)。