在加权图中找到最短路径

时间:2016-03-10 13:40:30

标签: algorithm graph dijkstra shortest-path

给出的是城市和航空公路和公路成本的图表,作为每对城市之间的边缘权重。我们需要找到分钟。从源头城市到目的地城市旅行的成本,因为我可以通过航空公司最多只能行驶一次。

到目前为止我的方法:选择每个气道边缘一次,然后将dijkstra仅应用于道路边缘的剩余图形。有没有办法改善这个?

3 个答案:

答案 0 :(得分:2)

构建定向(G, E),如下所示:

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

对于C以外的每个城市X,构建两个顶点:(C, yes)(C, no),其中"是"意味着"飞机使用"和"不"意味着"飞机未使用"。对于源城市X,只构建一个顶点(X, no)

边缘如下:

  • 任何(C, yes)到任何(D, no)都没有优势。
  • 当且仅当(C, yes)和{{之间存在道路时,(D, yes)(C, no)(分别为(D, no)C)有一条边。 1}},这条边的重量是道路的重量。
  • 当且仅当D(C, no)之间存在气道时,(D, yes)C才会有边缘,此边缘的权重是气道中。

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

复杂性将是有向图(Y, no)的最短路径问题的复杂性,其中(直到大O常数)具有与原始图相同数量的顶点和边。

根据this wiki page,这个问题可以在(G, E)时间内解决。当然,您可以简单地使用Dijkstra。

答案 1 :(得分:0)

如果你可以计算两个城市之间的直线距离,你可以使用A *而不是Dijkstra,使用距离函数作为启发式算法。肯定会扩展比Dijkstra更少的节点。

关于呼吸道,你的方法听起来不错。

答案 2 :(得分:0)

按照以下方式创建辅助定向图G.

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

对于G中的每条道路大众,将四条单向道路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'之间(恰好一次空中传输)。