Living-Dream 系列笔记 第35期

拓扑排序(\(\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);
}
}
}

没有例题(悲)。

posted @   _XOFqwq  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示