Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不相交子图的有向图拓扑排序_Python_Algorithm_Graph - Fatal编程技术网

Python 不相交子图的有向图拓扑排序

Python 不相交子图的有向图拓扑排序,python,algorithm,graph,Python,Algorithm,Graph,我正在寻找一种算法,它可以对一个图进行拓扑排序,从而生成一组列表,每个列表包含一个不相交子图的拓扑排序顶点 当一个节点依赖于两个不同列表中的一个节点时,困难的部分是合并列表 这是我的不完整代码/伪代码,其中图形是dict{node:[node,node,…]} 将图形拓扑排序为不相交列表 首先使用泛洪填充算法将其划分为不相交的子图,然后对每个子图进行拓扑排序。泛洪填充算法如何识别有向图的整个子图。根据您从哪个节点开始,算法可能无法到达更上游的节点,如果图是非循环的,则绝对不会。@shane从有向

我正在寻找一种算法,它可以对一个图进行拓扑排序,从而生成一组列表,每个列表包含一个不相交子图的拓扑排序顶点

当一个节点依赖于两个不同列表中的一个节点时,困难的部分是合并列表

这是我的不完整代码/伪代码,其中图形是dict
{node:[node,node,…]}

将图形拓扑排序为不相交列表
首先使用泛洪填充算法将其划分为不相交的子图,然后对每个子图进行拓扑排序。

泛洪填充算法如何识别有向图的整个子图。根据您从哪个节点开始,算法可能无法到达更上游的节点,如果图是非循环的,则绝对不会。@shane从有向图中构造一个无向图,对其进行泛洪填充,现在它已分区,您可以返回到原始图并对每个不相交的子图进行拓扑排序。
sorted_subgraphs = []

while graph:
    cyclic = True
    for node, edges in list(graph.items()):
        for edge in edges:
            if edge in graph:
                break
        else:
            del graph[node]
            cyclic = False

            sub_sorted = []
            for edge in edges:
                bucket.extend(...) # Get the list with edge in it, and remove it from sorted_subgraphs
            bucket.append(node)

            sorted_subgraphs.append(bucket)

    if cyclic:
        raise Exception('Cyclic graph')