博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拓扑排序
阅读量:4946 次
发布时间:2019-06-11

本文共 763 字,大约阅读时间需要 2 分钟。

什么是拓扑排序呢?他又是用来干嘛的?

生活中,我们经常面临这样的情况:几件事情之间有相互依赖关系,必须其中的几件发生,某件才能发生。我们可以用有向无环图来表示这种关系,一个点指向另一个点代表该点要先于另一点。注意一定是没有环的,否则就进入了无休止的死循环。。。

这样,每个点的入度代表该点先前的点数,任意时刻入度为0的点就是可以访问的点。每次访问一点并将其从图中删除,对应的点入度减1,不断重复这个过程,知道所有的点都被遍历,这就叫拓扑排序。特别的,点的访问顺序叫做拓扑序,一个DAG可能有多个拓扑序。

1 int ans[maxn],cnt; 2 queue
q; //队列用于存放入度为0的点 3 struct edge { //邻接表存储图 4 int v,next; 5 } E[maxm]; 6 void topo_sort() { 7 for(int i=1;i<=n;++i) if(!ind[i]) q.push(i); //先将入度为0的点入队 8 while(!q.empty()) { 9 int u=q.front();q.pop();10 ans[++cnt]=u; //记录拓扑序,通过cnt是否等于n还可判断是否存在拓扑序11 for(int p=head[u];p+1;p=E[p].next) //删边,该点指向的点的入度减1,同时将新的入度为0的点入队12 if(!(--ind[E[p].v])) q.push(E[p].v);13 }14 }

 

转载于:https://www.cnblogs.com/Mr94Kevin/p/9580334.html

你可能感兴趣的文章
CSS之Position详解
查看>>
javascript面向对象重写右键菜单事件
查看>>
UVa10791 - Minimum Sum LCM
查看>>
Android底部导航栏——FrameLayout + RadioGroup
查看>>
NOI2016 优秀的拆分 后缀数组
查看>>
Java消息服务
查看>>
Jtester使用
查看>>
详解CSS样式的position属性
查看>>
Python机器学习(5)——朴素贝叶斯分类器
查看>>
Mac 10.12连接iSCSI硬盘软件iSCSI Initiator X
查看>>
ffmpeg获取文件的总时长(mp3/mp4/flv等)
查看>>
Python virtualenvwrapper在Win下的安装和管理
查看>>
费马小定理
查看>>
mysql5.6 忘记root密码
查看>>
HTML 小练习(智联注册页)
查看>>
MSSQL优化之————探索MSSQL执行计划(转)
查看>>
使用DOS命令查找包含某一字符串的所有文件
查看>>
python强大的区间处理库interval用法介绍
查看>>
MVC开发中的常见错误-04-“System.NullReferenceException”类型的异常在 BBFJ.OA.WebApp.dll 中发生,但未在用户代码中进行处理...
查看>>
VS-常用的快捷键-总结
查看>>