算法:拓扑排序

来源:互联网 发布:含有大数据的新闻 编辑:程序博客网 时间:2024/06/10 17:27

定义:

对一个有向无环图(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

0 0
原创粉丝点击