【问题标题】:Finding the shortest path with only passing specific edge less or equal to one time in Graph在Graph中找到仅通过小于或等于一次的特定边的最短路径
【发布时间】:2022-01-11 10:26:27
【问题描述】:

给定一个具有普通边特定边的无向,我们的目标是找到最短的总和两个顶点(从开始顶点到结束顶点)之间的路径权重只穿过等于或少于一次的特定边。换句话说,有多个特定的边,最多只能使用其中一个

这是我在数据结构作业中遇到的一个问题,我坚持在 Graph 中存储边权重的第一步。因为Graph中有两种边,我不知道如何解决这个问题。

我知道使用Dijkstra算法可以得到最短路径,但是在这个过程中,如何修改算法以满足限制的要求?

非常感谢您回答我的问题!

【问题讨论】:

  • “仅通过等于或少于一次的特定边缘”:我不清楚。是指有多个特定边,最多只能使用其中一个,还是意味着所有特殊边都不能使用超过一次。我想这是第一个,但它的表述很糟糕。
  • @trincot 是你提到的第一个,我会修改我的问题,让它更清楚,非常感谢!

标签: algorithm data-structures graph shortest-path dijkstra


【解决方案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. 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多