algorithm - 在加权图中找到最短路径

标签 algorithm graph dijkstra shortest-path

给定的是一张城市图以及作为每对城市之间的边权重的航空公司和公路成本。我们需要找到最小值。考虑到我最多只能通过一次航空公司旅行的限制,从源城市到目的地城市的旅行成本。

到目前为止,我的方法是:选择每个航线边缘一次,然后仅将 dijkstra 应用于道路边缘上的剩余图形。有什么办法可以改善吗?

最佳答案

构造一个有向(G, E)如下:

X 为源城市,Y 为目的地城市。

对于除X之外的每个城市C,构造两个顶点:(C, yes)(C, no) ,其中“yes”表示“飞机已使用”,“no”表示“飞机未使用”。对于源城市X,只构造一个顶点(X, no)

边缘如下:

  • 从任何 (C, yes) 到任何 (D, no) 都没有边。
  • (C, yes)(D, yes) (resp. (C, no)(D, no)) 当且仅当CD之间有道路,这条边的权重就是道路的权重.
  • 存在从(C, no)(D, yes)的边当且仅当CC之间有气道D,这条边的权重就是气道的权重。

现在,只需找到图 G 中从 (X, no)(Y, yes) 的最短路径(resp.到 (Y, no)),这是仅使用一个气道(resp. 不使用气道)的最低成本。这两个中的最小值将是最终答案。


复杂度将是有向图 (G, E) 的最短路径问题的复杂度,它(最大 O 常数)与原始图具有相同数量的顶点和边.

根据 this wiki page , 这个问题可以在O(E+VloglogV) 时间内解决。为简单起见,您当然可以使用 Dijkstra。

关于algorithm - 在加权图中找到最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35918175/

相关文章:

php - 我需要未知数量的坐标字段(或几个字段)如何去做?

java - FileReader 已在此编译单元中定义错误 Java

c++ - 对两个 QVector 进行排序

java - 二十一点极小极大算法

java - 计算小于或等于 N 的两个数对的数量,使得对数的数字和为素数

java - 使用快速查找算法 (Java) 优化有向图中查找所有弱连通分量

linux - 如何使用 Gnuplot 5.2 制作多轴图?

在 C/C++ 中创建 "igraph"中的加权无向图

algorithm - 结合 Dijkstra 算法和 A* 搜索?

algorithm - 图算法题