拓扑排序
(1)在有向图中选一个没有前驱的顶点且输出之
(2)从图中删除该顶点和所有以它为尾的弧。
重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止,后一种情况则说明有向图中存在环。
可采用邻接表作为有向图的存储结构。具体算法如下:
- int TopoSort(ALGraph G)
- {
- FindInDegree(G,indegree); //对各顶点求入度
- InitStack(S);
- for(i=0;i<G.vexnum;++i)
- if(!indegree[i])Push(S,i); //入度为0者进栈
- count=0;
- while(!StackEmpty(S))
- {
- Pop(S,i);
- printf("i,G.vertices[i].data");
- ++count;
- for(p=G.vertices[i].firstarc; p; p=p->nextarc)
- {
- k=p->adjvex;
- if(!(--indegree[k]))Push(S,k); //若入度减为0,则入栈
- }
- }
- if(count<G.vexnum)return 0; //该有向图存在环
- else
- return 1;
- }
-
顶