拓扑排序 解题思路

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之路

HDOJ1811解题报告

Codefroces 919D Substring(拓扑排序+DP)

hdu6165(拓扑排序+tarjan缩点)

HDU 3342 Legal or Not(拓扑排序判断成环)

拓扑排序或差分约束Guess UVALive - 4255