如何在一对节点之间的无向图中找到所有边缘不相交的等价路径?

时间:2012-07-24 01:25:32

标签: algorithm graph graph-algorithm shortest-path max-flow

给定无向图G =(V,E),G中的边具有非负权重。

[1]如何找到两个节点s和t之间的所有边缘不相交和等成本路径?

[2]如何找到两个节点s和t之间的所有边缘不相交路径?

[3]如何找到两个节点s和t之间的所有顶点不相交和等成本路径?

[4]如何找到两个节点s和t之间的所有顶点不相交路径?

是否有任何近似算法?

1 个答案:

答案 0 :(得分:4)

构建一个树,其中每个节点都是单向图形路径的表示。

我知道,树也是一个图表,但在这个答案中,我将使用以下含义的术语:

  • vertex:是单向图中的顶点。它不是我树上的节点。
  • edge:是单向图中的边。它不属于我的树。
  • node:我树中的一个顶点,而不是图表中的顶点。
  • root:我树上没有父节点的唯一节点。
  • leaf:我树中没有孩子的任何节点。

我不会谈论树中的边缘,所以树边没有单词。此答案中的每个边缘都是图表的一部分。


构建树的算法

树的根是仅包含顶点s且不包含边的路径的表示。让它的权重为0。

对该树中的每个节点

执行

获取该节点表示的路径的末端顶点(我将其称为实际节点)并找到远离该末端顶点的所有边。 如果:没有边缘离开这个顶点,你就达到了死胡同。这条路径永远不会导致顶点t。因此,将此节点标记为叶子并赋予其无限的重量 其他:

对于这些边缘的每个
将子节点添加到实际节点。让它成为实际节点的副本。将边缘附加到路径的末端,然后将边缘末端顶点附加到路径。 (因此每个路径都遵循模式顶点 - 边 - 顶点 - 边 - 顶点 - ......) 现在遍历树,返回到根并检查是否有任何前辈有一个与刚刚添加的末端顶点相同的末端顶点。
如果您有匹配项,则新生成的节点是包含循环的路径的表示形式。将此节点标记为叶子并赋予其无限重量 其他如果没有循环,只需将新添加的边权重添加到节点权重。 现在测试,如果新生成的节点的末端顶点是顶点t 如果确实,请将此节点标记为叶子,因为此节点表示的路径是从s到t的有效路径。


该算法总是在有限时间内结束。最后,树中有3种类型的叶子:

  • 表示具有无限权重的死胡同的节点
  • 表示循环的节点,也具有无限权重
  • 表示从s到t的有效路径的节点,其权重是作为此路径一部分的所有边权重的总和。

由叶子表示的每个路径都有其独立的边缘序列(但可能包含相同的顶点序列),因此具有有限权重的叶子表示从s到t的完整的边缘不相交的pathes集合。这是运动解决方案[2]

现在对所有有限重量的叶子都这样做:
将其权重及其路径写入列表。按权重对列表进行排序。现在,具有相同权重的路径是列表中的邻居,您可以在此已排序列表中查找并提取所有等成本路径组。这是运动解决方案[1]

现在,对此列表中的每个条目执行操作:
向此列表中的每个路径添加其顶点列表。完成此操作后,您将拥有一个包含以下列的表:

  • 重量
  • 路径
  • 第一个顶点(总是s)
  • 第二个顶点
  • 第三个顶点
  • ...

按照顶点对此表格进行排序,并按重量对所有顶点进行排序(按第1个顶点,第2个顶点,第3个顶点,...,重量排序) 如果此有序表中的一行具有与之前的行相同的顶点序列,则删除该行。

这是两个节点s和t之间所有顶点不相交路径的列表,因此它是运动解决方案[4]

在此列表中,您可以找到所有等价路径作为邻居,因此您可以轻松地从该列表中提取两个节点s和t之间的所有顶点不相交和等成本路径组,所以这里有运动解决方案[3]