繁体   English   中英

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

[英]Shortest path with a maximum number of vertices

我想找到两个顶点之间的最短路径和一个额外的约束:可以访问max n个顶点。 该图是定向的,连接的,非负权重,并且可以包含循环。

例:

在此输入图像描述

  1. n = 2的最短路径0-> 218
  2. n = 3的最短路径0-> 322
  3. 最短路径0-> 3n = 49

到目前为止,我已经实现了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加上该边缘的路径。 反向单链表对此非常方便。

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

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

Nist.gov也有一些算法。

假设您想要找到从源顶点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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM