一、基础知识

1、AOV-网 (Activity On Vertex Network):用顶点表示活动,用弧表示活动之间的优先关系的有向无环图。

2、AOE-网 (Activity On Edge Network):用顶点表示事件,用边表示活动,带权的有向无环图。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

3、拓扑排序:将AOV-网中所有顶点排成一个线性序列(顶点 数据结构-图的应用-拓扑排序 算法 第1张 到 数据结构-图的应用-拓扑排序 算法 第2张 顶点有一条路径,则该线性序列中 数据结构-图的应用-拓扑排序 算法 第3张 一定在 数据结构-图的应用-拓扑排序 算法 第4张 之前)

二、拓扑排序算法思想

1、在AOV-网中选取一个无前驱的顶点,并输出

2、从图中删除所有该顶点发出的有向边

3、重复1,2,直至

  全部顶点已输出,拓扑排序已完成。

  已经跳出循环,但是图中还有顶点,说明图中存在环。

数据结构-图的应用-拓扑排序 算法 第5张

三、算法实现

①求出个顶点的入度存入indegree数组,并将入度为0的顶点入栈。

②只要栈不空

  将栈顶元素保存在topo数组

  并将  数据结构-图的应用-拓扑排序 算法 第6张 顶点的每个邻接顶点的入度减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指向 数据结构-图的应用-拓扑排序 算法 第7张 的邻接点
18         while(p){                                //遍历数据结构-图的应用-拓扑排序 算法 第8张的出度表,将其中存在顶点的入度减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; 

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄