【问题标题】:Shortest two disjoint paths; two sources and two destinations最短的两条不相交的路径;两个来源和两个目的地
【发布时间】:2012-08-11 15:00:06
【问题描述】:

我们得到一个未加权的无向图 G = (V, E) 其中 |V| 和 |E| 6。我们还给出了四个顶点a、b、a'、b'。有没有办法找到两个节点不相交的路径 a -> a'b -> b' 使得它们的长度之和最小?
我的首先想到的是先找到最短路径a -> a',从图中删除,然后找到最短路径b -> b'。我认为这种贪婪的方法行不通。

注意:在整个应用程序中,ab是固定的,而a' b' 在每次查询时都会发生变化,因此使用预计算以提供高效查询的解决方案会更可取。另请注意,只需要最小长度总和,而不是实际路径。

非常感谢任何帮助、想法或建议。提前非常感谢!

【问题讨论】:

  • 它不会起作用,因为最短路径 a->a' 可能会通过一个节点,这是从 b' 到达 b 的唯一途径。作为预处理阶段,您可以存储图中每个节点与 a 和 b 的最小距离
  • @Gir 是的,确实有道理。
  • 可能没有那么有用,但我要指出,即使任何一对节点之间存在路径,也可能没有解决方案(想象 2 个图,一个包含 & b,另一个 a' & b',以及一个额外的节点,这是在两个图之间获取的唯一方法)。
  • 有一本书Survivable Networks: Algorithms for Diverse Routing,对这些问题做了很多很好的介绍和解决方案。这是谷歌书上的a link

标签: algorithm math optimization graph-theory


【解决方案1】:

这可以简化为最短边不相交路径问题:

  1. (可选)将图中的所有链折叠成单个边。这会生成一个较小的加权图(如果原始图中有任何链)。
  2. 通过将每条边替换为一对有向边,将无向图转换为有向图。
  3. 将每个节点拆分为一对节点:一个仅具有原始节点的传入边,另一个仅具有其传出边。用一条有向边连接每对节点。 (例如下图中的节点c应该拆分为c1c2;现在每条路径都包含节点c原图中的strong>应该经过变换图中的边c1 -> c2;这里是xy 表示图中除节点 c 之外的所有节点。

现在如果 a = ba' = b',您会遇到与在您的previous question 中(这是Minimum-cost flow problem 并且可以通过为每个边分配等于1 的流量来解决,然后在a 和b 之间搜索一个最小成本流量,流量=2)。如果 a != b,您只需创建一个公共源节点并将 ab 都连接到它。如果 a' != b',对公共目标节点执行相同操作。

但是如果 a != ba' != b',最小成本流问题不适用。相反,这个问题可以解决为Multi-commodity flow problem


我之前的(不正确的)解决方案是连接两对 (a, b) 和 (a', b ') 到公共源/目标节点,然后找到最小成本流。下图是这种方法的反例:

【讨论】:

    【解决方案2】:

    这个怎么样?从 a1 -> a2 执行 BFS(广度优先搜索)遍历并删除路径并计算 BFS b1 -> b2。现在重置图形并首先对 b1->b2 执行相同操作,然后删除路径,然后删除 a1->a2。 答案是最小的总和。

    【讨论】:

    • 这不起作用;反例有点太长,无法评论。
    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多