1、定义:对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序的序列,简称拓扑序列。
2、条件:每个顶点出现且只出现一次
若A在序列中排在B的前面,则在图中不存在从B到A的路径
3、特性:拓扑排序并不唯一
有向无环图一定存在拓扑排序
4、步骤:选择一个入度为0的顶点并输出之;
从图中删除此顶点及其所有出边;
循环执行以上两步,直到不存在入度为0的顶点为止;如果剩下入度非0的顶点(输出的顶点数小于图中的顶点数),就说明有回路,不存在拓扑排序。
5、示例:
将上图用字典表示:G = { 'a':'bf', 'b':'cdf','c':'d','d':'ef','e':'f',f:''}
代码实现:
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']