zoukankan      html  css  js  c++  java
  • 图论(二)------拓扑排序

    拓扑排序是对有向无圈图的顶点的一种排序。如果存在一条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
  • 相关阅读:
    编写 grunt 插件经验
    Sencha Touch 手机移动开发框架 HTML5 项目压缩方案;
    随笔 编辑推荐 上头条了, 贴出来做个记念!
    Javascript 俄罗斯方块 游戏代码解释!
    30天自制操作系统(NASM+GCC版)
    Logisim 打不开的解决方案(Windows10)
    Kali Linux 2020通过UEFI硬盘安装(免u盘)
    开源一个自制的ORM框架,基于Java原生JDBC(应该是全网首个吧)
    书单
    前端技术文章收集
  • 原文地址:https://www.cnblogs.com/linxiyue/p/3826390.html
Copyright © 2011-2022 走看看