码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-11-21 15:49:03      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:保存   width   ica   删除   结构   error   关系   数组   its   

一、基础知识

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; 

 

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

标签:保存   width   ica   删除   结构   error   关系   数组   its   

原文地址:https://www.cnblogs.com/lollipop-25/p/9994063.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!