在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中找到仅通过小于或等于一次的特定边的最短路径的主要内容,如果未能解决你的问题,请参考以下文章

715B Complete The Graph

HDOJ6958KD-Graph(并查集)

在 C++ 中找到小于特定整数值的最接近的浮点值?

02:找第一个只出现一次的字符

C++信奥赛题目——第一个只出现一次的值

测试 256 位 YMM AVX 寄存器元素是不是等于或小于零的最有效方法