Java 向非循环图添加边
我有一个有向边和无向边的图,现在我想通过用有向边替换无向边来去除它们(每个无向边变成一条有向边)。每个无向边有两种可能性(用一个方向或另一个方向的有向边替换) 如何确定无向边的方向,使我的图保持非循环(a) 我的方法: 在没有无向边的图上进行拓扑排序,逐个添加无向边(使它们从较小的拓扑值指向较大的拓扑值) 这似乎不起作用,因为拓扑排序创建了一个偏序(不是所有顶点都可以相互比较),我需要的是一个总序(所有顶点都可以比较)。如何将部分订单扩展为总订单 我的方法失败的示例图:Java 向非循环图添加边,java,algorithm,graph,topological-sort,Java,Algorithm,Graph,Topological Sort,我有一个有向边和无向边的图,现在我想通过用有向边替换无向边来去除它们(每个无向边变成一条有向边)。每个无向边有两种可能性(用一个方向或另一个方向的有向边替换) 如何确定无向边的方向,使我的图保持非循环(a) 我的方法: 在没有无向边的图上进行拓扑排序,逐个添加无向边(使它们从较小的拓扑值指向较大的拓扑值) 这似乎不起作用,因为拓扑排序创建了一个偏序(不是所有顶点都可以相互比较),我需要的是一个总序(所有顶点都可以比较)。如何将部分订单扩展为总订单 我的方法失败的示例图: n=8(顶点数,从1到
- n=8(顶点数,从1到n编号)
- m=5(定向边数)
- l=6(无向边数)
对我来说,你的方法似乎是有效的。取顶点的任意顺序;现有边的方向应使其指向“右侧”,即从位置较低的顶点到位置较高的顶点。这总是可能的,并导致一个非循环有向图
在下一步中,您可能可以使用生成一个包含初始排序作为子集的总排序。拓扑排序按定义是一个线性排序,每个线性排序都是一个总排序,因此从理论上讲,您的方法很好。然而,您的实现是错误的
也就是说,在拓扑顺序定义中,如果从a到b有一条边,那么b4!),你将顶点的标识符(8和4)与它们的拓扑顺序(4和6)混合在一起。拓扑排序按定义是一个总顺序。然后我不明白为什么我的方法不起作用,我添加了一个我的方法失败的示例。我做错了什么?你错误地实现了它,我认为在你的拓扑顺序定义中,如果从a到b有一条边,那么b比a小。但是在第二个图中,您打破了规则,添加了从4到6的边,您将顶点的标识符(8,4)与其拓扑顺序(4,6)混合在一起。我将这两条评论转化为答案该方法对我来说也是有效的,也许我的错误在其他地方,我添加了一个示例,说明我的方法无法澄清。arghhhh,我添加了定向边(从较大的地形值到较小的地形值),然后我开始添加无向边,并将它们从较小的地形值定向到较大的地形值(错误!). 谢谢,我调整了我的实现,看看它是否有效。