在加权图中找到最短路径

Posted

技术标签:

【中文标题】在加权图中找到最短路径【英文标题】:finding shortest path in a weighted graph 【发布时间】:2016-06-25 09:31:40 【问题描述】:

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

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

【问题讨论】:

我认为您的解决方案很好,可能没有更有效的方法。 【参考方案1】:

如果您可以计算两个城市之间的直线距离,则可以使用 A* 代替 Dijkstra,使用该距离函数作为启发式。与 Dijkstra 相比,您肯定会扩展更少的节点。

关于航路,你的方法听起来不错。

【讨论】:

【参考方案2】:

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

X为源城市,Y为目标城市。

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

边缘如下:

从任何(C, yes) 到任何(D, no) 都没有边。 从(C, yes)(D, yes)(分别是(C, no)(D, no))有一条边当且仅当CD 之间有道路,并且这条边的权重是道路重量。 从(C, no)(D, yes) 有一条边当且仅当CD 之间有气道,并且这条边的权重就是气道的权重。

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


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

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

【讨论】:

【参考方案3】:

按照以下方式创建一个辅助有向图G'。

对于主图 G 中的每个城市 V,将两个城市 V' 和 V'' 添加到 G'。

为 G 中的每条道路 VW 添加四个单向道路 V'W'、W'V'、V''W''、W''V'' 到 G'。

为 G 中的每个空中连接 VW 添加两个单向连接 V'W'' 和 W'V'' 到 G'。

生成的图被定向并划分为两个子图,因此您只能从第一个子图乘飞机前往第二个子图,而不能返回。这确保您可以使用空气,例如最多一次。

您可以在 G' 上运行 Dijkstra 算法。现在,G 中 S 和 T 之间的最短路径将对应于 G' 中两条路径中较短的一条:一条在 S' 和 T' 之间(仅限地面),另一条在 S' 和 T'' 之间(正好是一次空中传输)。

【讨论】:

以上是关于在加权图中找到最短路径的主要内容,如果未能解决你的问题,请参考以下文章

Floyd最短路(带路径输出)

正加权有向无环图中的k-边最短路径

Bellman-Ford算法——为什么要循环V-1次?图有n个点,又不能有回路,所以最短路径最多n-1边。又因为每次循环,至少relax一边所以最多n-1次就行了!

去除最少边以强制增加未加权无向图中最短路径长度的算法

软考 系统架构设计师数学与经济管理① 图论应用

软考 系统架构设计师数学与经济管理① 图论应用