Java 向非循环图添加边

Java 向非循环图添加边,java,algorithm,graph,topological-sort,Java,Algorithm,Graph,Topological Sort,我有一个有向边和无向边的图,现在我想通过用有向边替换无向边来去除它们(每个无向边变成一条有向边)。每个无向边有两种可能性(用一个方向或另一个方向的有向边替换) 如何确定无向边的方向,使我的图保持非循环(a) 我的方法: 在没有无向边的图上进行拓扑排序,逐个添加无向边(使它们从较小的拓扑值指向较大的拓扑值) 这似乎不起作用,因为拓扑排序创建了一个偏序(不是所有顶点都可以相互比较),我需要的是一个总序(所有顶点都可以比较)。如何将部分订单扩展为总订单 我的方法失败的示例图: n=8(顶点数,从1到

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

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

我的方法:

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

这似乎不起作用,因为拓扑排序创建了一个偏序(不是所有顶点都可以相互比较),我需要的是一个总序(所有顶点都可以比较)。如何将部分订单扩展为总订单

我的方法失败的示例图:

  • n=8(顶点数,从1到n编号)
  • m=5(定向边数)
  • l=6(无向边数)
定向边:

  • 2->1
  • 3->2
  • 2->6
  • 4->5
  • 5->8
  • 无向边:

  • 14
  • 2.5
  • 37
  • 4.8
  • 6 7
  • 6.8
  • 仅包含有向边和顶点旁边的拓扑顺序值的图:

    现在,当我开始添加无向边(并根据拓扑顺序值定向它们)时,我在添加边8->4后得到一个循环:


    对我来说,你的方法似乎是有效的。取顶点的任意顺序;现有边的方向应使其指向“右侧”,即从位置较低的顶点到位置较高的顶点。这总是可能的,并导致一个非循环有向图


    在下一步中,您可能可以使用生成一个包含初始排序作为子集的总排序。

    拓扑排序按定义是一个线性排序,每个线性排序都是一个总排序,因此从理论上讲,您的方法很好。然而,您的实现是错误的


    也就是说,在拓扑顺序定义中,如果从a到b有一条边,那么b4!),你将顶点的标识符(8和4)与它们的拓扑顺序(4和6)混合在一起。

    拓扑排序按定义是一个总顺序。然后我不明白为什么我的方法不起作用,我添加了一个我的方法失败的示例。我做错了什么?你错误地实现了它,我认为在你的拓扑顺序定义中,如果从a到b有一条边,那么b比a小。但是在第二个图中,您打破了规则,添加了从4到6的边,您将顶点的标识符(8,4)与其拓扑顺序(4,6)混合在一起。我将这两条评论转化为答案该方法对我来说也是有效的,也许我的错误在其他地方,我添加了一个示例,说明我的方法无法澄清。arghhhh,我添加了定向边(从较大的地形值到较小的地形值),然后我开始添加无向边,并将它们从较小的地形值定向到较大的地形值(错误!). 谢谢,我调整了我的实现,看看它是否有效。