Dijkstra 的最短路径算法不返回权重最小的最短路径

Posted

技术标签:

【中文标题】Dijkstra 的最短路径算法不返回权重最小的最短路径【英文标题】:Dijkstra's Shortest Path algorithm not returning shortest path with smallest weight 【发布时间】:2015-11-09 13:00:37 【问题描述】:

我正在使用一个名为 JGraphT 的图形库,在我的程序中,我有几个顶点通过一条边连接在一起,边具有旅行成本的权重。

在一个我只用一个整数加权的例子中,它有效!但是当我将其更改为使用我的班级FlightData 作为权重时,它不起作用。

这是我的代码,权重只是一个整数:

List<DefaultWeightedEdge> path = DijkstraShortestPath.findPathBetween(graph, start, end);
    for(int i = 0; i < path.size(); i++) 
        DefaultWeightedEdge edge = path.get(i);
        System.out.println((i+1) + " " + graph.getEdgeSource(edge) + " -> " + graph.getEdgeTarget(edge));
    

这是我作为 FlightData 类的重量代码:

List<FlightData> path = DijkstraShortestPath.findPathBetween(graph, start, end);    
for(int i = 0; i < path.size(); i++) 
        FlightData f = path.get(i);
    System.out.println((i+1) + " " + graph.getEdgeSource(f) + " -> " + graph.getEdgeTarget(f));

我的 FlightData 类只是一个带有访问器方法的类:

import org.jgrapht.graph.DefaultWeightedEdge;

public class FlightData extends DefaultWeightedEdge

    private String flightNumber, depTime, arrTime;
    private double price;

    public FlightData(String flightNumber, String depTime,
            String arrTime, double price) 
        this.flightNumber = flightNumber;
        this.depTime = depTime;
        this.arrTime = arrTime;
        this.price = price;
    

    public String getFlightNumber() 
        return flightNumber;
    
    public String getDepartureTime() 
        return depTime;
    
    public String getArrivalTime() 
        return arrTime;
    
    public double getFlightPrice() 
        return price;
    

谁能指出我正确的方向,为什么一个人揭示了具有最低权重的最短路径,而另一个揭示了最短路径但不一定是最低权重? (如果两个顶点之间有直接路径,它只会返回那个!)

【问题讨论】:

如何在FlightData 边上指定权重?此外,“它不起作用”也不是对您的问题的有用描述。 什么不起作用?你期望它做什么,它做了什么? 这个问题具有误导性;该算法有效,是您的实现有问题。 【参考方案1】:

您需要在FlightData 中覆盖DefaultWeightedEdge.getWeight(),例如返回price:

@Override
protected double getWeight() 
  return price;

否则,您将使用默认边权重,即1.0

【讨论】:

以上是关于Dijkstra 的最短路径算法不返回权重最小的最短路径的主要内容,如果未能解决你的问题,请参考以下文章

用Dijkstra算法求图中从顶点a到其他各顶点间的最短路径,并写出执行算法过程中各步的状态。

Python 图_系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径算法

C++ 图进阶系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径求解算法

1091.二维矩阵中的最短路径

手撸golang 基本数据结构与算法 图的最短路径  狄克斯特拉算法

图算法|Dijkstra最短路径算法