[英]Shortest path with a maximum number of vertices
我想找到两个顶点之间的最短路径和一个额外的约束:可以访问max n个顶点。 该图是定向的,连接的,非负权重,并且可以包含循环。
例:
到目前为止,我已经实现了Djikstras算法以获得简单的最短路径,我的想法是保持当前访问的顶点的计数器,如果它超过n它需要一个或多个步骤并尝试使用另一个路径..但到目前为止因为我知道Djikstras不能用于回溯作为解释在这里 。
另一个想法是以某种方式存储表中每个节点之间的每条路径。 但我不确定Djikstra如何发现重量为18的0-> 2路径,因为它不是真正的最短路径......
有没有人有任何想法如何解决这个问题?
将每个顶点划分为n
个顶点,即对于顶点u
,我们创建n
个顶点,表示为(u, 1) ... (u, n)
,第二个数字表示到此顶点的步数。 对于从u到v的每个边,我们在(u,i)到(v,i + 1)中创建边,其中在新图中1<=i<=n-1
。 现在,如果你想用u计算u和v之间的最短路径,只需从(u,1)做Dijkstra,那么你的答案就是min(result (v, i) | 1<=i<=n)
顶点总数可以是n * n,因此复杂度约为O(n^2*log(n^2))
令COST_TO(v,n)为具有n个边或更小边的顶点v的最小路径的总权重。
当n = 0时,答案很简单:
对于所有v,如果v是源顶点,则COST_T(v,0)= 0,否则为无穷大
对于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加上该边缘的路径。 反向单链表对此非常方便。
假设您想要找到从源顶点S
到最多K
边缘组成的目标顶点T
的最短路径。 我选择了K
,因为你问题中的n
是误导性的 - 如果你想找到最多访问n
个顶点的最短路径,其中n
是顶点总数,你可以运行Dijkstra,因为任何简单路径最多都有n
顶点 - 我认为这不是你想要的。
然后,如果你想要一个简单的实现, Bellman-Ford在这里是个不错的选择:
在外循环i-th
迭代之后,算法计算了从源顶点S
到由at most i edges
组成的任何其他顶点的最短路径,因此它由at most i + 1 vertices
。 因此,为了解决您的问题,运行Bellman-Ford的K - 1
外环,并检查到目标顶点T
的距离是否定义良好(不同于无穷大),如果是,则得到结果。 否则,在访问K
或更少顶点时无法从S
到达T
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.