有向无环图的拓扑排序

有了之前实现的深度优先算法,可以直接给出有向无环图的拓扑排序。

结果就是深度优先排序中,最后完成的要排在前面。



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()

        

输出结果:

[夹克, 腰带, 领带, 衬衣, 手表, 鞋子, 裤子, 内裤, 袜子]

逆序便是正确答案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值