拓扑排序(Topological Sorting)
目录:
AOV网(Activity On Vertex Network)
定义
在现代化管理中,人们常用有向图来描述和分析一项工程的计划和实施过程,一个工程常被分为多个小的子工程,这些子工程被称为活动(Activity),在有向图中若以顶点表示活动,有向边表示活动之间的先后关系,这样的图简称为AOV网。一个AOV网必定是一个有向无环图,也就是不应该带有回路,否则就会出现先后关系的自相矛盾。
条件
- 每个顶点出现且只出现一次
- 若A在序列中排在B的前面,则在图中不存在从B到A的路径
特性
- 拓扑排序并不唯一
- 有向无环图一定存在拓扑排序
举个栗子
如图所示,比如这是一项大工程,大工程的最终目的是实现f,将该项工程划分成一个个的小工程,依次实现。而要完成b的基础上必须要先完成a,完成c的基础上要完成a,完成d的基础上要完成b和c,以此类推…
拓扑排序(Topological Sorting)
构造拓扑序列的拓扑排序算法思想
- 选择一个入度为0的顶点;
- 从AOV网中删除此顶点及以此顶点为起点的关联边;
- 重复上述两步直到不存在入度为0的顶点为止;
- 若AOV网中还有顶点,则说明有向图存在回路。
代码实现
def topoSort(graph):
in_degrees = dict((u, 0) for u in graph) # 初始化所有顶点入度为0
num = len(in_degrees)
for u in graph:
for v in graph[u]:
in_degrees[v] += 1 # 计算每个顶点的入度
Q = [u for u in in_degrees if in_degrees[u] == 0] # 筛选入度为0的顶点
seq = []
while Q:
u = Q.pop() # 默认从最后一个删除
seq.append(u)
for v in graph[u]:
in_degrees[v] -= 1 # 移除其所有出边
if in_degrees[v] == 0:
Q.append(v) # 再次筛选入度为0的顶点
if len(seq) == num: # 输出的顶点数是否与图中的顶点数相等
return seq
else:
return None
G = {
'a': 'bf',
'b': 'cdf',
'c': 'd',
'd': 'ef',
'e': 'f',
'f': ''
}
print(topoSort(G))
# 输出结果如下
['a', 'b', 'c', 'd', 'e', 'f']