Java 如何在不创建圈的情况下向有向无环图添加边

Java 如何在不创建圈的情况下向有向无环图添加边,java,algorithm,graph,directed-acyclic-graphs,Java,Algorithm,Graph,Directed Acyclic Graphs,我有一个有向边和无向边的图,现在我想通过用有向边替换无向边来去除它们(每个无向边变成一条有向边)。每个无向边有两种可能性(用一个方向或另一个方向的有向边替换) 如何确定无向边的方向,使我的图保持非循环 我的做法: 创建一个仅包含有向边的图形,然后将无向边1乘1(作为有向边)添加。现在我有一个问题,我的问题是将有向边添加到图形中,同时保持DAG属性(只有有向边,没有循环) 如何向DAG添加边并确保生成的图形也是DAG?让我们通过查看一个示例来尝试解决此问题:- 假设我有以下一组顶点作为定向顶点:-

我有一个有向边和无向边的图,现在我想通过用有向边替换无向边来去除它们(每个无向边变成一条有向边)。每个无向边有两种可能性(用一个方向或另一个方向的有向边替换)

如何确定无向边的方向,使我的图保持非循环

我的做法:

创建一个仅包含有向边的图形,然后将无向边1乘1(作为有向边)添加。现在我有一个问题,我的问题是将有向边添加到图形中,同时保持DAG属性(只有有向边,没有循环)


如何向DAG添加边并确保生成的图形也是DAG?

让我们通过查看一个示例来尝试解决此问题:-

假设我有以下一组顶点作为定向顶点:-

(1,2)
(2,3)
(4,5)
(5,6)
(7,3)
(3,4)
(6,7)
下面是一组无向顶点:-

(1,2)
(2,3)
(4,5)
(5,6)
(7,3)
(3,4)
(6,7)
所以现在如果我们在纸上创建图形,它应该是这样的

1 -> 2 -> 3 
         /  \
        /  4   -> 5 -> 6
       /              /  \
     -----------------7 
所以你可以清楚地看到有两条无向边,我们想用有向边来代替它们

因此,我们可以选择第一个无向对作为(3,4),放置一个顶点3->4,然后我们将调用dfs(1),如果找到一个循环,那么(3,4)不是一个有效的循环,我们将放置为4->3,但在我们的例子中,3->4不会导致任何循环

我们继续我们的下一对称为(6,7),放置6->7会导致一个循环,所以我们放置7->6,这会给我们一个DAG


这就像一个暴力解决方案。让我仔细考虑一下,有没有更好的方法来解决这个问题。

使用所有有向边构建初始DAG。拓扑排序。将排序施加的偏序扩展为总序(例如,在一个层级晶格中排列顶点并逐级枚举)。请注意,所有边都从较小的顶点转到较大的顶点


现在根据总的顺序(从较小的顶点到较大的顶点)定向无向边。很容易看出,生成的图形没有循环(要存在循环,必须有一条边朝相反方向移动)。

这对我来说是可行的:

在没有无向边的图上进行拓扑排序,逐个添加无向边(使它们从较大的拓扑值指向较小的拓扑值)

这样可以保证在添加边后,DAG将保持为DAG


@用户58697,不需要扩展偏序,因为在对图形进行拓扑排序后,存在一个总序。每个节点的地形值与其他地形值相当。

在不创建循环的情况下添加到DAG的链接

  • 在DAG中拾取新链接将指向的随机节点。这是一个
    toNode
  • toNode
    连接到图形中不在该
    toNode
    子树中的任何其他节点

  • 它从不创建循环。

    基本思想是进行拓扑排序

    拓扑排序数组后的eg为3,4,5,6,1,2 我们从3->其他边引导无向边
    在那之后做4次,然后做5次,以此类推


    这样可以保证在添加边后DAG将保持为DAG。

    我尝试了拓扑排序,然后使用分配给节点的值来确定方向(方向总是从较小的值到较大的值)。这并不适用于我所有的例子。你所说的“总序”是什么意思?在顶级排序之后,某些顶点仍然是不可比较的(即,只存在一个偏序)。您需要一个总顺序(每对顶点都是可比较的),与您已有的偏序兼容。请参阅以获取灵感。为什么有些顶点仍然无法比拟?我不明白为什么Topo排序会产生一个部分的顺序而不是一个总的顺序(我不能仅仅比较Topo排序分配给彼此的所有值吗?)@ Anavopura考虑一个图<代码> A- > B,A- > C < /代码>。它不强制执行
    B
    C
    之间的任何顺序。此解决方案效率太低。