【问题标题】:How do I transform an undirected, very cyclic graph into a directed acyclic graph?如何将无向、非常循环的图转换为有向无环图?
【发布时间】:2010-12-15 02:02:52
【问题描述】:

我正在研究修改后的 TopSort 算法,但无法找到/创建用于测试的大型(超过 1000 个节点)有向无环图。我有一个来自另一个项目的无向样本图,它的规模很大,但有很多周期。有没有一种算法可以用来引导边缘,从而不再有循环?

【问题讨论】:

    标签: graph


    【解决方案1】:

    this 提供了一种获取非循环图的方法。基本上,图遍历会产生一棵树,它定义了原始节点上的偏序。然后,只需引导所有边,使它们要么根据偏序指向一致的方向,要么位于 2 个无序的元素之间(它们可以指向任何方向)。

    【讨论】:

    • 我没有读完,但据我了解:本文第 2.1 节描述了一种将有向图转换为 DAG 的方法(即中断循环)。并且您建议添加上一个步骤,以使用图的(任何)遍历将无向图转换为有向图。
    【解决方案2】:

    为了保证新的有向图是连接的,我会使用如下的 beadth-first 搜索。

     old_undirected graph G
     new_directed graph D
     dequeue Q
     v is any node in G
     add v to D
     Q.push_back(v)
     while(Q is not empty):
         v = Q.pop_front()
         for all neighbors u to v:
             if u in D
                  add edge u->v to D
             else
                  add u to D and add edge v->u to D
                  Q.push_back(u)
    
     return D
    

    这个图应该包含原始图的所有边,但应该有方向,不会有任何圆圈。

    【讨论】:

      【解决方案3】:

      您希望将图形转换为有根树的森林。对图的每个组件进行广度优先或深度优先的图遍历。在遍历的过程中,在父子顶点之间做一条有向边。

      http://en.wikipedia.org/wiki/Graph_traversal

      【讨论】:

      • errm.. 他不是要造树。他想引导每条边,使结果图是非循环的。并且建议的方法将删除一些边(从而制作一棵树)。
      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多