拓扑排序
DAG有向无环图
AOV网:顶点表示活动,弧表示活动间先后关系的有向图,即活动在顶点上的网络
拓扑序列:将AOV所有顶点v0,v1,...vn-1排成线性序列vi0,vi1,...vin-1,满足:若vi到vj有一条路径,则vi排在vj前面。vi0,vi1,...vin-1就是一个拓扑序列(不一定唯一)
拓扑排序步骤:
在有向图中选一个入度为0的顶点,且输出;
在图中删除该顶点和以它为尾的弧;
重复这两部,直至全部顶点输出,此时得到无环有向图的所有顶点的拓扑序列;或者图中剩下顶点中再也没有入度为0的顶点,此时拓扑序列不存在,且图中必有环。
有向无环图,拓扑排序过程如下:
首先,V6和v1是没有前驱的,所以我们就随机选去一个输出,我们先输出V6,删除和V6有关的边,得到如下图结果:
然后继续寻找没有前驱的顶点,发现V1没有前驱,所以输出V1,删除和V1有关的边,得到下图的结果:
然后,又发现V4和V3都是没有前驱的,那么就随机选取一个顶点输出(具体看你实现的算法和图存储结构),我们输出V4,得到如下图结果:
然后,我们输出没有前驱的顶点V3,得到如下结果:
然后,我们分别输出V5和V2,最后全部顶点输出完成,该图的一个拓扑序列为:
v6–>v1—->v4—>v3—>v5—>v2
拓扑排序算法的实现:
AOV网用邻接表(表头节点增加一个入度域,先求出每个顶点的入度)作为存储结构,以栈作为辅助存储空间:
(1)扫描邻接表的顶点表,找入度为0的顶点入栈
(2)当栈非空时:
a、弹出栈顶元素(设vj),输出
b、在邻接表中找vj直接后继vk,将vk入度减1,将入度减为0的顶点入栈
(3)栈空时,若输出顶点数小于AOV网顶点总数,则必存在环,不存在拓扑序列。否则得到全部顶点的一个拓扑序列。
为节省存储空间,具体实现时可利用邻接表中顶点节点入度域为0的入度域建立静态链表,即静态链栈。
设游标模拟栈顶指针,游标变量top存放入度域为0的顶点下标(top=入度为0的顶点号)。
初始时top=-1。
遇到入度域为0的顶点将其入栈时,当前top值写入入度域,top=顶点号;
出栈时,top=其所指顶点节点的入度域的值
相关阅读
7-1 冒泡法排序(20 分) 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后
二叉排序树 二叉排序树(Binary Search Tree,BST):又称二叉查找树,是一种高效的数据结构。 定义 二叉排序树或者是一棵空树,或者是具有
序言 对于堆排序的学习,实际上就是对于 堆 这一种数据结构的学习,把堆学会了,堆排序自然也就学会了。1、为什么使用堆这种数据结构
传统的评分表是都是用手工记录、手工或计算器计算,然后再人工排序,这样做不仅效率低下,利用Excel中排序等相关功能制作的评分表,使总
目录 冒泡排序 改进的冒泡排序(鸡尾酒排序) 选择排序 插入排序 二分插入排序 希尔排序 快速排序 归并排序 堆排序 计数排序 基数