具有最大顶点数的最短路径

时间:2015-10-27 03:57:49

标签: java algorithm graph graph-theory graph-algorithm

我想找到两个具有附加约束的顶点之间的最短路径:可以访问max n 顶点。图是有向的,连通的,非负权重,可能包含周期。

示例:

enter image description here

  1. 最短路径 0-> 2 n = 2 18
  2. 最短路径 0-> 3 n = 3 22
  3. 最短路径 0-> 3 n = 4 9
  4. 到目前为止,我已经实现了Djikstras算法以获得简单的最短路径,我的想法是保持所访问的当前顶点的计数器,如果它超过 n 它需要一个或多个退一步并尝试另一条路径......但据我所知,Djikstras不能用于回溯here

    另一个想法是以某种方式存储表中每个节点之间的每条路径。但是我不确定Djikstra如何发现路径 0-> 2,权重18 ,因为它不是真正的最短路径......

    有没有人有任何想法如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

将每个顶点划分为n个顶点,即对于顶点u,我们创建表示为n的{​​{1}}个顶点,第二个数字显示为这个顶点。对于从u到v的每个边,我们在(u,i)到(v,i + 1)的新图中创建(u, 1) ... (u, n)的边。现在,如果你想用u计算u和v之间的最短路径,只需从(u,1)做Dijkstra,那么你的答案是1<=i<=n-1

顶点总数可以是n * n,因此复杂度约为min(result (v, i) | 1<=i<=n)

答案 1 :(得分:1)

令COST_TO(v,n)为顶点v的最小路径的总权重,其边界为n或更小。

当n = 0时,答案很简单:

对于所有v,COST_T(v,0)= 0如果v是源顶点且无穷大

对于n> 0,COST_TO(v,n)是COST_TO(v,n-1)和所有COST_TO(w,n-1)+ WEIGHT(w,v)的最小值,其中有一个边缘w到v

因此,对于n = 0到N,用COST_(v,n)<跟踪所有顶点。无穷大及其成本,并从n-1的值计算n的成本。

同时,您可以跟踪每个v的最小权重路径 - 每次使用边缘规则将成本更新为v时,v的新路径是w加上该边缘的路径。反向单链表对此非常方便。

答案 2 :(得分:0)

也许尝试bfs并检查最大值的顶点数。保存满足约束的最好的。

关于它的视频 https://youtu.be/TvHV3PB8ANs

Nist.gov也有一些算法。

答案 3 :(得分:0)

假设您要查找从源顶点S到最多T条边的目标顶点K的最短路径。我选择K,因为您问题中的n会产生误导 - 如果您想找到最多访问n个顶点的最短路径,其中n是总数顶点,你可以运行Dijkstra,因为任何简单的路径最多有n个顶点 - 我认为这不是你想要的。

然后,如果您想要一个简单的实现,Bellman-Ford在这里是个不错的选择:

在外循环的i-th迭代之后,算法计算了从源顶点S到由at most i edges组成的任何其他顶点的最短路径,因此它包含at { {1}}。因此,为了解决您的问题,运行Bellman-Ford的at most i + 1 vertices外环,并检查到目标顶点K - 1的距离是否定义良好(不同于无穷大),如果是,你有你的结果。否则,访问T或更少顶点时无法从T访问S

相关问题