数据结构-图的应用-拓扑排序

Posted lollipop-25

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-图的应用-拓扑排序相关的知识,希望对你有一定的参考价值。

一、基础知识

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; 

 

以上是关于数据结构-图的应用-拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记——图的应用2(拓扑排序关键路径)

数据结构-图的应用-拓扑排序

图的应用(最小生成树,拓扑排序)

图的应用(最小生成树,拓扑排序)

图的应用(最小生成树,拓扑排序)

图的拓扑排序