在Graph中找到仅通过小于或等于一次的特定边的最短路径
Posted
技术标签:
【中文标题】在Graph中找到仅通过小于或等于一次的特定边的最短路径【英文标题】:Finding the shortest path with only passing specific edge less or equal to one time in Graph 【发布时间】:2022-01-11 10:26:27 【问题描述】:给定一个具有普通边和特定边的无向图,我们的目标是找到最短的总和两个顶点(从开始顶点到结束顶点)之间的路径权重,只穿过等于或少于一次的特定边。换句话说,有多个特定的边,最多只能使用其中一个。
这是我在数据结构作业中遇到的一个问题,我坚持在 Graph 中存储边权重的第一步。因为Graph中有两种边,我不知道如何解决这个问题。
我知道使用Dijkstra算法可以得到最短路径,但是在这个过程中,如何修改算法以满足限制的要求?
非常感谢您回答我的问题!
【问题讨论】:
“仅通过等于或少于一次的特定边缘”:我不清楚。是指有多个特定边,最多只能使用其中一个,还是意味着所有特殊边都不能使用超过一次。我想这是第一个,但它的表述很糟糕。 @trincot 是你提到的第一个,我会修改我的问题,让它更清楚,非常感谢! 【参考方案1】:解决办法是复制图如下:
复制顶点,这样对于每个原始顶点 A,您都有一个 A 和一个 A'。
如果在原始图中 A 和 B 之间有一条正常边,那么在新图中,在 A 和 B 之间以及 A' 和 B' 之间放置一条边
如果在原始图中 A 和 B 之间有一条特定的边,那么在新图中放置一条从 A 到 B' (不是相反的!)和从 B 到 A' 的(有向的)边(同样:不是倒数!)。这些边缘应该有方向。
如果现在的任务是找到 S 和 D 之间的最短路径,那么在新图中解决找到 S 和 D 或 S 和 D' 之间的最短路径的问题,哪个曾经最短。为此,您可以使用 Dijkstra 算法的标准实现,从 S 开始,当您找到 D 或 D' 时结束。
【讨论】:
哦,我想我明白意思了,但是如果图形是无向的,我应该在 A&B' 和 A'&B 之间添加新边吗? 我已经更新了我的答案,使某些方面更加清晰。 我想我大概明白意思了。但是为什么上面的过程可以保证最多只使用一个特定的边缘呢? 是的,因为一旦访问了“重音”节点,就无法返回到非重音节点。 感谢您的帮助!我想我已经完全意识到了!【参考方案2】:给定 n
特定边运行 Dijkstra 的搜索 n
次。
在每次运行时,n
节点之一(我们称之为节点 i
)应该设置为其实际权重,而所有其他 n-1
节点应设置为无限值。
在每次运行结束时存储最短路径和步骤i
在所有运行结束时,从存储的路径中选择最短的。
set all n edges weight to infinity
for i=0; i < n ; i++
set edge i to it real weight
run run Dijkstra's search
store path
set all n edges weight to infinity
select the shortest path from the stored paths.
【讨论】:
以上是关于在Graph中找到仅通过小于或等于一次的特定边的最短路径的主要内容,如果未能解决你的问题,请参考以下文章