给出的是城市和航空公路和公路成本的图表,作为每对城市之间的边缘权重。我们需要找到分钟。从源头城市到目的地城市旅行的成本,因为我可以通过航空公司最多只能行驶一次。
到目前为止我的方法:选择每个气道边缘一次,然后将dijkstra仅应用于道路边缘的剩余图形。有没有办法改善这个?
答案 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'之间(恰好一次空中传输)。