邻接矩阵中的寻路

时间:2013-04-07 23:49:36

标签: java algorithm shortest-path adjacency-matrix

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

示例

给定这个数组

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次移动。

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

1 个答案:

答案 0 :(得分:0)

非常肯定这是NP Hard通过减少到Dukeling建议的哈密尔顿路径问题。假设我们有一个多时间算法X来解决这个问题。那么这意味着我们可以问X在任何2个顶点之间找到最小长度路径的问题,这两个顶点在到达终点的路上访问所有其他顶点。

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

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