一、基础知识
1、AOV-网 (Activity On Vertex Network):用顶点表示活动,用弧表示活动之间的优先关系的有向无环图。
2、AOE-网 (Activity On Edge Network):用顶点表示事件,用边表示活动,带权的有向无环图。
3、拓扑排序:将AOV-网中所有顶点排成一个线性序列(顶点 到 顶点有一条路径,则该线性序列中 一定在 之前)
二、拓扑排序算法思想
1、在AOV-网中选取一个无前驱的顶点,并输出
2、从图中删除所有该顶点发出的有向边
3、重复1,2,直至
全部顶点已输出,拓扑排序已完成。
已经跳出循环,但是图中还有顶点,说明图中存在环。
三、算法实现
①求出个顶点的入度存入indegree数组,并将入度为0的顶点入栈。
②只要栈不空
将栈顶元素保存在topo数组
并将 顶点的每个邻接顶点的入度减1,如果此时有入度为0的点,则放入栈中
③无环结束,返回OK
有环,返回ERROR
1 Status TopologicalSort(ALGraph G, int topo[]) //有向图用邻接表存储 2 { 3 //若G无回路,则生成G的一个拓扑序列topi[]并返回OK,否则返回ERROR 4 FindInDegree(G, indegree); //求出各顶点的入度,存放在数组indegree中 5 InitStack(S); //初始化栈S 6 for(int i=0; i<G.vexnum; i++){ //遍历indegree,将入度为0的顶点压入栈中 7 if(indegree[i] == 0){ 8 Push(S, i); 9 } 10 } 11 m=0; 12 while(!StackEmpty(S)){ 13 int i=0; 14 Pop(S, i); //将栈顶元素出栈 15 topo[m]=i; //存入topo序列中 16 ++m; 17 p=G.vertices[i].firstarc; //将P指向 的邻接点 18 while(p){ //遍历的出度表,将其中存在顶点的入度减1 19 k=p->adjvex; 20 --indegree[k]; 21 if(indegree[k] == 0){ //若入度为0,压入栈 22 Push(S, k); 23 } 24 p=p->nextarc; 25 } 26 } 27 if(m<G.vexnum) return ERROR; 28 else return OK;
原文地址:https://www.cnblogs.com/lollipop-25/p/9994063.html
时间: 2024-10-07 17:32:51