拓扑排序 解题思路

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YanghuiNipurean/article/details/52267147

所谓拓扑排序是对有向无圈图顶点的一种排序,如果存在一条从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);
 }
}

通过访问的深度对图进行排序,如果没有访问过,则将此顶点压入桟中,继续访问邻点,直到没有邻点为止,再依次回退。

猜你喜欢

转载自blog.csdn.net/YanghuiNipurean/article/details/52267147