• 图论(二)------拓扑排序


    拓扑排序是对有向无圈图的顶点的一种排序。如果存在一条vi到vj的路径,则vi排在vj前面。如果图含有圈,则拓扑排序是不可能的。

    拓扑排序的两种排法:

    一个简单的求拓扑排序的算法是先找出任意一个没有入边的顶点,然后显示出该顶点,并将它和它的边一起从图中删除,对图的其余部分应用同样的方法。

    首先,对于每个顶点计算它的入度(入边的数量),将所有入度为0的顶点放入到一个队列中。当队列不空时,删除一个顶点v,并将与v相邻的所有顶点的入度

    减1.只要一个顶点的入度降为0.就把该顶点放入队列中。

    图的代码:

    class Vertex(object):
        def __init__(self,key):
            self.id=key
            self.adj={}
        def addNeighbor(self,nbr,weight=0):
            self.adj[nbr]=weight
        def getNeighbors(self):
            return self.adj.keys()
        def getId(self):
            return self.id
        def getWeight(self,key):
            return self.adj[key]
    class Graph(object):
        def __init__(self):
            self.vertexlist={}
            self.size=0
        def addVertex(self,key):
            vertex=Vertex(key)
            self.vertexlist[key]=vertex
            self.size+=1
            return vertex
        def getVertex(self,key):
            return self.vertexlist.get(key)
        def __contains__(self,key):
            if key in self.vertexlist:
                return True
            else:
                return False
        def addEdge(self,f,t,weight=0):
            if f not in self.vertexlist:
                self.addVertex(f)
            if t not in self.vertexlist:
                self.addVertex(t)
            self.vertexlist[f].addNeighbor(self.vertexlist[t],weight)
        def getVertices(self):
            return self.vertexlist.keys()
        def __iter__(self):
            return iter(self.vertexlist.values())
    

    拓扑排序:

    def topSort(G):
        top=[]
        queue=[]
        inDegree={}
        for v in G:
            inDegree[v]=0
        for v in G:
            for w in v.getNeighbors():
                inDegree[w]+=1
        for v in inDegree:
            if inDegree[v]==0:
                queue.append(v)
        while queue:
            v=queue.pop(0)
            top.append(v)
            for i in v.getNeighbors():
                inDegree[i]-=1
                if inDegree[i]==0:
                    queue.append(i)
        return top
  • 相关阅读:
    软件工程团队作业--详细设计说明书
    软件工程团队作业-详细设计阶段
    软件工程-架构设计成果物
    软件工程-架构设计阶段
    软件工程-需求分析成果物
    软件工程团队作业-需求分析阶段
    软件工程-编写调研提纲
    软件工程第四次作业
    软件工程第三次作业
    20199103 2019-2020-2 《网络攻防实践》期末大作业
  • 原文地址:https://www.cnblogs.com/linxiyue/p/3826390.html
Copyright © 2020-2023  润新知