有了之前实现的深度优先算法,可以直接给出有向无环图的拓扑排序。
结果就是深度优先排序中,最后完成的要排在前面。
Vertex是之前实现的
from vertex import Vertex
from collections import deque
class Graph(object):
def __init__(self):
#Adjs邻接表字典,数据结构:{Vertex1:[x,y,z], vertex2:[a,b,c,d],......}
#要访问某个顶点的所有邻居,Adjs[Vertex]
#返回为该顶点的邻居列表,如[v,x,y,z]
self.Adjs = {}
def addAdj(self,Vertex,*neighbors):
'添加邻接链表'
list = []
for neighbor in neighbors:
list.append(neighbor)
self.Adjs[Vertex] = list
def DFS_VISIT(G,u,result):
Vertex.time += 1
u.deep = Vertex.time
u.color = 'gray'
for v in G.Adjs[u]:
if v.color == "white":
v.parent = u
DFS_VISIT(G, v,result)
u.color = 'black'
Vertex.time += 1
u.finish = Vertex.time
result.append(u)
def DFS(G,preffered,result):
Vertex.time #时间截初始化为0
for vertex in preffered:#vertex是邻接表字典的关键字,即为每个顶点
if vertex.color == "white":
DFS_VISIT(G, vertex,result)
def main():
#初始化顶点
under = Vertex("内裤")
socks = Vertex("袜子")
belt = Vertex("腰带")
trousers = Vertex("裤子")
shoes = Vertex("鞋子")
watch = Vertex("手表")
clothes = Vertex("衬衣")
tie = Vertex("领带")
jacket = Vertex("夹克")
G = Graph()
#添加邻接链表
G.addAdj(under,trousers,shoes)
G.addAdj(socks,shoes)
G.addAdj(belt,jacket)
G.addAdj(trousers,belt,shoes)
G.addAdj(shoes)
G.addAdj(watch)
G.addAdj(clothes,belt,tie)
G.addAdj(tie,jacket)
G.addAdj(jacket)
preffered = [clothes,watch,under,socks,belt,trousers,shoes,tie,jacket]#控制遍历的先后顺序
result = []
DFS(G,preffered,result)#广度优先,结果保存在result
print(result)
if __name__ == "__main__":
main()
输出结果:
[夹克, 腰带, 领带, 衬衣, 手表, 鞋子, 裤子, 内裤, 袜子]
逆序便是正确答案