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

一、基础知识

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

数据结构-图的应用-拓扑排序的相关文章

数据结构:图论:拓扑排序! 两种方法!

拓扑排序:(1)由偏序变成全序的过程!直观的说,偏序指集合中仅有部分成员之间可比较!而全序指集合中全体成员之间均可比较! (2)将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前. 数据结构中进行拓扑排序的方法: 方法一: (1)在有向图中选一个没有前驱的顶点且输出之! (2)从图中删除该顶点和所有以它为尾的弧. (3)重复上述两部,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止.后一种情况说明有向图中存在环! 代码: #

7-9-有向图无环拓扑排序-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向无环图拓扑排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c.ALGraph.c    

[从今天开始修炼数据结构]无环图的应用 —— 拓扑排序和关键路径算法

上一篇文章我们学习了最短路径的两个算法.它们是有环图的应用.下面我们来谈谈无环图的应用. 一.拓扑排序 博主大学学的是土木工程,在老本行,施工时很关键的节约人力时间成本的一项就是流水施工,钢筋没绑完,浇筑水泥的那帮兄弟就得在那等着,所以安排好流水施工,让工作周期能很好地衔接就很关键.这样的工程活动,抽象成图的话是无环的有向图. 在表示工程的有向图中,用顶点表示活动,弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,成为AOV网(Active On Vertex Network) ※ 若在

数据结构课程笔记_拓扑排序

何谓拓扑排序? 由某个集合上的一个偏序得到该集合上的一个全序,这个操作叫做拓扑排序. 如何得到一个有向图的拓扑排序? 按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系,由此所得顶点的线性序列称之为拓扑有序序列. 如何进行拓扑排序? 1.从有向图中选取一个没有前驱的顶点: 2.从有向图中删去此顶点以及所有以它为尾的弧: 重复上述两步直至图空,或者图中找不到无前驱的顶点为止,后一种情况说明图中有环. 算法中需要用定量描述代替定性概

图基本算法 拓扑排序(基于dfs)

拓扑排序,是对有向无回路图进行排序,以期找到一个线性序列,这个线性序列在生活正可以表示某些事情完成的相应顺序.如果说所求的图有回路的话,则不可能找到这个序列. 在大学数据结构课上,我们知道求拓扑排序的一种方法.首先用一个入度数组保存每个顶点的入度.在进行拓扑排序时,我们需要找到入度为0的点,将其存入线性序列中,再将其从图中删除(与它相关的边都删除,相邻的顶点的入度均减1),再重复上面的操作,直至所有的顶点都被找到为止.如果不对每次找入度为0的顶点的方法进行处理,而直接去遍历入度数组,则该算法的时

图的拓扑排序(转)

一.概述 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前.   通常,这样的线性序列称为满足拓扑次序(TopoiSicai Order)的序列,简称拓扑序列.注意:   ①若将图中顶点按拓扑次序排成一行,则图中所有的有向边均是从左指向右的.   ②若图中存在有向环,则不可能使顶点满足拓扑次序.   ③一个DAG的拓扑序列通常表示某种方案

算法系列之图--拓扑排序

本文介绍使用深度先搜索对向无环图(DAG)进行拓扑排序. 对于一个有向无环图G=(V,E)来说,其拓扑排序是G中所有结点的一种线性次序,该次序满足如下条件:如果G包含边(u,v)则结点u在拓扑排序中处于结点v的前面(若图G包含一个环路则不可能排出一个线性次序).可将图中的拓扑排序看成是将图的所有结点在一条水平线上排开,图中所有边都从左指向右. 给一个拓扑图如下示: 拓扑排序算法与DFS相似,但是在拓扑排序的过程中,每个结点都是后与其临接链表里的结点而放入Stack中. 具体代码如下示: 1 #i

图的拓扑排序、关键路径、最短路径算法 -- C++实现

一:拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列. 拓扑排序就是要找到入度为0的顶点,并依次压栈.首先将栈顶顶点输出,删除以此顶点为弧尾的顶点,并更新其他顶点的入度.若入度为0,则继续压栈.更新完毕继续出栈,直至栈空.元素出栈并输出

图的拓扑排序

定义: 图的拓扑排序是对有向无环图来说的,无向图和有环图没有拓扑排序,或者说不存在拓扑排序,对于一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若图G存在边< u, v >,则u在线性序列中出现在v之前.对一个有向无环图进行拓扑排序产生的线性序列称为满足拓扑次序的序列.一个有向无环图可以表示某种动作或者方案,或者状态,而有向无环图的拓扑序列通常表示某种某案切实可行或者各个成员之间的某种关系. 举个栗子,看上面那个图,v1v2v3v4v5v6v7v8是