数据结构之图的拓扑排序

数据结构之图的拓扑排序_第1张图片
image.png
from ds.Graph import Graph


class DFSGraph(Graph):
    def __init__(self):
        super().__init__()
        self.time = 0

    def dfs(self):
        for v in self:
            v.setColor('white')
            v.setPred(None)
        for v in self:
            if v.getColor() == 'white':
                self.dfsvisit(v)

    def dfsvisit(self,startV):
        startV.setColor('gray')
        self.time += 1
        startV.discoveryTime = self.time

        for nbr in startV.getConnections():
            if nbr.getColor() == 'white':
                nbr.setPred(startV)
                self.dfsvisit(nbr)

        startV.setColor('black')
        self.time+=1
        startV.finishTime = self.time


if __name__ == '__main__':
    g = DFSGraph()
    # g.addVertex('一个鸡蛋')
    # g.addVertex('一勺油')
    # g.addVertex('一杯松仁粉')
    # g.addEdge('A', 'B')
    # g.addEdge('A', 'D')
    # g.addEdge('B', 'C')
    # g.addEdge('B', 'D')
    # g.addEdge('D', 'E')
    # g.addEdge('E', 'B')
    # g.addEdge('E', 'F')
    # g.addEdge('F', 'C')


    # g.addEdge('开始', '一个鸡蛋')
    # g.addEdge('开始', '一勺油')
    # g.addEdge('开始', '牛奶')
    g.addEdge('一个鸡蛋','一杯松仁粉')
    g.addEdge('一勺油', '一杯松仁粉')
    g.addEdge('牛奶', '一杯松仁粉')
    g.addEdge('一杯松仁粉', '倒入混合物')
    g.addEdge('加热平底锅', '倒入混合物')
    g.addEdge('倒入混合物', '出现气泡翻面')
    g.addEdge('一杯松仁粉', '加热糖浆')
    g.addEdge('出现气泡翻面', '开始享用')
    g.addEdge('加热糖浆', '开始享用')
    #
    for node in g:
        print(node.getId(),node.discoveryTime,node.finishTime)

    print('-'*70)
    g.dfs()
    lst = []
    for node in g:
        print(node.getId(),node.discoveryTime,node.finishTime)
        lst.append(node)

    # # 基于结束时间,将顶点按照递减顺序存储在列表中。
    print('-'*70)
    for node in lst:
        print(node.getId(), node.finishTime)

    lst.sort(key=lambda x:-x.finishTime)

    for node in lst:
        print(node.getId(),end=' ')

    # g = DFSGraph()
    # for i in range(6):
    #     g.addVertex(i)
    #
    #
    # g.addEdge(0, 1, 5)
    # g.addEdge(0, 5, 2)
    # g.addEdge(1, 2, 4)
    # g.addEdge(2, 3, 9)
    # g.addEdge(3, 4, 7)
    # g.addEdge(3, 5, 3)
    # g.addEdge(4, 0, 1)
    # g.addEdge(5, 4, 8)
    # g.addEdge(5, 2, 1)
    #
    # g.dfs()


输出


一个鸡蛋 0 0
一杯松仁粉 0 0
一勺油 0 0
牛奶 0 0
倒入混合物 0 0
加热平底锅 0 0
出现气泡翻面 0 0
加热糖浆 0 0
开始享用 0 0
----------------------------------------------------------------------
一个鸡蛋 1 12
一杯松仁粉 2 11
一勺油 13 14
牛奶 15 16
倒入混合物 3 8
加热平底锅 17 18
出现气泡翻面 4 7
加热糖浆 9 10
开始享用 5 6
----------------------------------------------------------------------
一个鸡蛋 12
一杯松仁粉 11
一勺油 14
牛奶 16
倒入混合物 8
加热平底锅 18
出现气泡翻面 7
加热糖浆 10
开始享用 6
加热平底锅 牛奶 一勺油 一个鸡蛋 一杯松仁粉 加热糖浆 倒入混合物 出现气泡翻面 开始享用 


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