我想找到两个具有附加约束的顶点之间的最短路径:可以访问max n 顶点。图是有向的,连通的,非负权重,可能包含周期。
示例:
到目前为止,我已经实现了Djikstras算法以获得简单的最短路径,我的想法是保持所访问的当前顶点的计数器,如果它超过 n 它需要一个或多个退一步并尝试另一条路径......但据我所知,Djikstras不能用于回溯here。
另一个想法是以某种方式存储表中每个节点之间的每条路径。但是我不确定Djikstra如何发现路径 0-> 2,权重18 ,因为它不是真正的最短路径......
有没有人有任何想法如何解决这个问题?
答案 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)
答案 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
。