对一个AOV网进行拓扑排序(TopologicalSort)

  对一个AOV网进行拓扑排序的算法有很多,下面介绍一种比较常用的一种方法的步骤:
一、算法思想:
  ①从AOV网中选择一个没有前驱的顶点并输出;
  ②从网中删除该顶点和所有以它为起点的有向边;
  ③重复①和②直到当前的AOV网为空或当前网中不存在无前驱的结点为止。后一种情况说明有向图中必然存在环
二、伪代码如下
 1 bool TopologicalSort(Graph G){
 2     InitStack(S);           //初始化一个栈,用来存放入度为零的顶点
 3     for(int i = 0; i < G.vertex_num; i++)
 4         if(!degree[i])
 5             Push(S,i);      //将所有入度为零的顶点进栈
 6     int count = 0;          //用来记录当前输出的顶点数目
 7     while(IsEmpty(S)){
 8         Pop(S,i);
 9         print(i,G.vertices[i].data);
10         count++;            //输出i号顶点并计数
11         for(p = G.vertices[i].firstarc; p; p = p->nextarc){
12             k = p->adjvex;  //对i号顶点的每个邻接点的入度减1;
13             if(!(--indegree[k]))    //若入度为零,则入栈
14                 Push(S,k);
15         }//for
16     }//while
17     if(count < G.vertex_num)
18         return false;       //该有向图有回路
19     else
20         return true;
21 }//TopologicalSort
三、算法性能分析
  时间复杂度:由于输出每个顶点的同时还要遍历以它为起点的边,故拓扑排序的时间复杂度为O(V+E)
 
posted @ 2021-11-30 14:15  某科学的撒把豆子  阅读(134)  评论(0)    收藏  举报