拓扑排序 解题思路
Posted Nipuream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拓扑排序 解题思路相关的知识,希望对你有一定的参考价值。
序
所谓拓扑排序是对有向无圈图顶点的一种排序,如果存在一条从v到w的路径指向,则在排序中w就出现在v的后面,典型的例子就是大学的选课问题。一般的有两种解题思路,一种是用非递归的方式来实现、另一种则是用深度访问搜索递归实现。
用非递归的方式实现:
List<Vertex> sortList = new ArrayList<>();
Queue<Vertex> q = new Queue<Vertex>();
void topSort()
for each Vertex v
if(v.indegree == 0 )
q.enqueue(v);
while( !q.isEmpty())
Vertex v = q.dequeue();
sortList.add(v);
for each Vertex w adjacent v
if(--w.indegree == 0)
q.enqueue(w);
首先找到入度为0的顶点,然后再依次搜索它的邻点,如果邻点的入度减一为0则是我们要找的点,依次类推,最后程序终止,如果sortList.size 不等于 图的顶点个数,则此图为有圈图,如果等于顶点个数,则sortList的顺序就是我们的拓扑排序的结果。
用递归的方式实现:
List<Vertex> sortList = new ArrayList<>();
Queue<Vertex> q = new Queue<Vertex>();
List<Vertex> topSort()
//找到入度为0的顶点
for each Vertex v
if(v.indegree == 0 )
q.enqueue(v);
for each Vertex v in q
visit(v);
void visit(Vertex v)
if(!v.visit)
v.visit = true;
for each Vertex w adjacent v
visit(w);
sortList.add(v);
通过访问的深度对图进行排序,如果没有访问过,则将此顶点压入桟中,继续访问邻点,直到没有邻点为止,再依次回退。
以上是关于拓扑排序 解题思路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 310 最小高度数[拓扑排序 BFS] HERODING的LeetCode之路
Codefroces 919D Substring(拓扑排序+DP)