【问题标题】:Pathfinding in adjacency matrix邻接矩阵中的寻路
【发布时间】:2013-04-07 23:49:36
【问题描述】:

给定一个邻接矩阵,你如何找到两个节点之间的最短路径,同时至少遍历每个点一次并返回它需要多少次移动?

示例

给定这个数组

int[][] points = { { 0, 1 },{ 0, 2 },{ 1, 2 },{ 1, 3 },{ 3, 4 } }; 

我像这样制作一个相邻的矩阵......

     0    1    2    3    4   
0   [0]  [1]  [1]  [0]  [0] 
1   [1]  [0]  [1]  [1]  [0]  
2   [1]  [1]  [0]  [0]  [0] 
3   [0]  [1]  [0]  [0]  [1]
4   [0]  [0]  [0]  [1]  [0]

从 0 到 4 的最短路径是 (0-2)(2-1)(1-3)(3-4),计为 4 步。

我真的不知道该怎么走。可能是最小生成树解决方案?提前致谢。

【问题讨论】:

  • 遍历每个点至少一次 -> 听起来类似于Hamiltonian path,这不是一个容易有效解决的问题。
  • @trashgod,但我们需要至少访问每个顶点一次。 Johnsons 算法在 poly time 中运行,但这似乎与一些 NP Hard 问题有关(如果所有边权重均为 1,则不完全如此)。也许我错过了一些东西。
  • 假设所有边的权重都是 1。@tigger

标签: java algorithm shortest-path adjacency-matrix


【解决方案1】:

按照 Dukeling 的建议,通过简化为哈密顿路径问题,可以确定这是 NP Hard。假设我们有一个多时间算法 X 来解决这个问题。那么这意味着我们可以问 X 的问题,即在任何 2 个顶点之间找到一条最短长度的路径,该路径在到达终点的过程中会访问所有其他顶点。

现在,由于我们需要至少访问所有顶点一次,这意味着这样一条路径的最小长度是 (|V| - 1)。因此,如果我们的算法给了我们一条大小为 (|V| - 1) 的路径,我们已经在多时间内回答了哈密顿路径的可判定性问题,因为我们可以在所有顶点对上运行我们的算法 X(其中有 O(n ^2)) 在多时间里也是如此。

可能有一种使用动态编程/递归的方法,但我无法证明它是多时间。访问所有顶点的从 s 到 t 的最短路径可以通过查看图 G/{s} 来计算,并询问给定 i \in Neighbors(s),从 i 到 t 的最短路径是什么。然后我们知道从 s 到 t 的最短路径必须等于 s 附加到它的邻居之一(特别是通向 t 的最短路径的那个)。

【讨论】:

  • 不应该认为这是课堂作业。是*的意思是它已经上交了。我只是想弄清楚如何去做以获得学习经验。
  • 好吧,我一定错过了什么。我得再想想。你能看到我的论点缺少什么吗?这可能有助于我们找到正确的行动方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2015-07-02
  • 2019-11-04
  • 2012-11-12
  • 2013-11-30
  • 1970-01-01
相关资源
最近更新 更多