通过给定集合的两个顶点之间的最小路径

时间:2014-04-09 08:30:52

标签: algorithm data-structures graph-theory graph-algorithm

假设我有一个源节点 S ,目标节点 D 和一组 A 的中间节点 P1,P2,P3 ,... 在边加权无向图中。我想找到顶点 Pi∈A 最小化dist(S,Pi)+ dist(D,Pi) ?此外,从 S到D 的整体路径应该只包含集合A 中的一个节点。什么是有效的算法?我不想采用蛮力方法。

1 个答案:

答案 0 :(得分:6)

蛮力是什么意思?

没有假设

如果删除关于&#34的假设,则只有A"中的一个节点。你可以按照以下步骤进行:

  • 找到从S到所有Pi的最短路径(一次调用Dijkstra算法)
  • 找到从D到所有Pi的最短路径(一次调用Dijkstra算法)
  • 通过Pi迭代并选择最小化d(S,Pi)+ d(D,Pi)的那个

复杂性:就A加上Dijkstra实现的复杂性而言是线性的(取决于所使用的堆结构)

假设

根据您的假设,我认为您必须独立地从每个Pi进行最短路径搜索

  • 每个Pi
    • 在gpg中找到S和D的最短路径G \ A u {Pi}(删除所有其他Pj')
  • 通过Pi迭代并选择最小化d(S,Pi)+ d(D,Pi)的那个

现在复杂性成为最短路径算法(Dijkstra或其他)的复杂性的一倍

假设 - 似乎是最佳的

上述两种方法的结合将是创造一个理论"图形,只有路径通过A的一个点,所以从实际的角度来看,你会:

  • 找到从S到所有Pi的最短路径,假设你没有穿过A的任何其他元素,你可以通过假设,Pis'没有"外部"边缘。这样,dijkstra算法将正确识别从S到Pi的距离,而不会穿越任何其他Pj
  • 找到从D到所有Pi的最短路径(与上面相同)
  • 通过Pi迭代并选择最小化d(S,Pi)+ d(D,Pi)的那个

复杂性:就A加上Dijkstra实现的复杂性而言是线性的(取决于所使用的堆结构),因此它与Dijkstra的复杂性相同(它必须至少"读取"所有顶点,所以A的线性复杂度是无关紧要的。)