算法:拓扑排序

定义:

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。

应用:

有向图来表示,图中的顶点代表活动(子工程),图中的有向边代表活动的先后关系,即有向边的起点的活动是终点活动的前序活动,只有当起点活动完成之后,其终点活动才能进行。通常,我们把这种顶点表示活动、边表示活动间先后关系的有向图称做顶点活动网(Activity On Vertex network),简称AOV网。即不应该带有回路,因为若带有回路,则回路上的所有活动都无法进行。

拓扑排序算法(python):

v表示顶点:v=['a','b','c','d','e'],e表示有向边:e=[('a','b'),('a','d'),('b','c'),('d','c'),('d','e'),('e','c')]

def topoSort(vertex,edge):
    def indegree0(vertex, edge): 
        '''删除度为0的节点'''
        if vertex==[]:
            return None
        tmpv=vertex[:]
        for i in edge:
            if i[1] in tmpv:
                tmpv.remove(i[1])
        if tmpv==[]:
            return -1
        for v in tmpv:
            for i in range(len(edge)):
                if v in edge[i]:
                    edge[i]='toDel' #占位,之后删掉
        if edge:
            eset=set(edge)
            eset.remove('toDel')
            edge[:]=list(eset)
        if vertex:
            for v in tmpv:
                vertex.remove(v)
        return tmpv
    # 开始拓扑排序
    result=[]
    while True:
        nodes=indegree0(vertex,edge)

        if nodes==None:
            break
        if nodes==-1:
            print('there\'s a circle.')
            return None
        result.extend(nodes)
    return result

发布了392 篇原创文章 · 获赞 492 · 访问量 241万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览