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

拓扑排序是对有向无圈图的顶点的一种排序。如果存在一条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
原文地址:https://www.cnblogs.com/linxiyue/p/3826390.html