拓扑排序

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=其所指顶点节点的入度域的值

拓扑排序_第1张图片


你可能感兴趣的:(数据结构,拓扑排序,拓扑序列)