如何将非DAG图形转换为DAG图形?

时间:2016-06-28 12:32:18

标签: directed-acyclic-graphs bayesian-networks

大家好,

是否有任何通用算法将非DAG(有向无环图)作为输入并输出有向非循环图。

目前,我不确定将使用哪些数据结构来表示我的图表。但是,我现在正在搜索算法。

希望你们能就此事通知我。

干杯〜

我想离开这个: enter image description here

对此: enter image description here

NEW GRAPH GRAPH 这仅供解决方案BeyelerStudios提供 enter image description here

1 个答案:

答案 0 :(得分:1)

您总是可以简单地翻转一些边以从循环图中获得非循环图(具有顶点V和边E的图G):

input: G(V,E), n = |V|

visited <- empty set
queue <- empty queue
for each node in V
    // skip visited nodes
    if visited.find(node)
        continue
    // push a dummy edge (node is unvisited)
    queue.push(edge(inf, node))
    while !queue.empty()
        edge <- queue.pop()
        if visited.find(edge.stop)
            // potential cycle detected
            if edge.start != edge.stop
                // eliminate loops, if any
                E.flip(edge)
        else
            visited.insert(edge.stop)
            for each outgoing edge e at edge.stop
                queue.push(e)

根据您使用的队列,您会得到不同的行为:

  • 堆栈(LIFO队列)导致深度优先遍历
  • FIFO队列导致广度优先遍历
  • 优先级队列导致包含其生成树的DAG

上面的代码中有一个空洞:检测到潜在的循环。想象一下顶点为A, B, C和边A->B, A->C, C->B的图形。上述代码段会在最后处理C->B时检测到潜在的循环。如果您想消除在此时引入周期的边缘的有效边消除歧义,则需要显示还没有从BC的路径。这是一项艰巨的任务,this answer here中有一些好的答案(和提示):基本上你需要执行另一个图遍历来检测(或排除)这种冲突的路径。