【问题标题】:jgrapht adding existed edge to a graph <DefaultDirectedWeightedGraph>jgrapht 将现有边添加到图 <DefaultDirectedWeightedGraph>
【发布时间】:2016-03-22 20:34:19
【问题描述】:

我想创建一个有向加权图,然后通过 Dijkstra 算法找到一个顶点到花药之间的最短路径,代码如下所示:

import org.jgrapht.alg.DijkstraShortestPath;
import org.jgrapht.graph.DefaultDirectedWeightedGraph;

public class testing {

    public static void main(String[] args) {

        DefaultDirectedWeightedGraph<Integer, Double> g;
        g = new DefaultDirectedWeightedGraph<Integer,Double>(Double.class);


        g.addVertex(0);
        g.addVertex(1);
        g.addVertex(2);
        g.addVertex(3);
        g.addVertex(4);
        g.addVertex(5);
        g.addEdge(4, 5, 0.8);//1-Edge
        g.addEdge(3, 4, 0.1);//2-Edge
        g.addEdge(0, 1, 0.2);//3-Edge
        g.addEdge(1, 2, 0.3);//4-Edge   
        g.addEdge(2, 3, 0.1);//5-Edge
        g.addEdge(0, 5, 0.7);//6-Edge   
        g.addEdge(4, 0, 0.7);//7-Edge   
        g.addEdge(4, 1, 0.5);//8-Edge
        g.addEdge(2, 4, 12.8);//9-Edge

        System.out.println(g.toString());

        DijkstraShortestPath<Integer, Double>shortest = 
                new DijkstraShortestPath<Integer, Double>(g, 1, 4);

        System.out.println(shortest.getPathEdgeList() );


    }

}

([0, 1, 2, 3, 4, 5], [0.8=(4,5), 0.1=(3,4), 0.2=(0,1), 0.3=(1,2), 0.7=(0,5), 0.5=(4,1), 12.8=(2,4)])
[0.3, 12.8]

而不是[0.3,0.1,0.1] 1->2->3

我知道在addEdge Jdocument 中说,如果图中存在具有相同权重的另一条边,则您不能向图中添加一条边。 有没有办法解决这个问题?

【问题讨论】:

    标签: java dijkstra jgrapht


    【解决方案1】:

    问题是您使用 Double.class 作为您的 Edge 类。如果这样做,您只能为每个图添加一个唯一值 Double,因为该图不允许重复边。相反,请像这样声明您的图表:

        DefaultDirectedWeightedGraph<Integer, DefaultWeightedEdge> g;
        g = new DefaultDirectedWeightedGraph<Integer,DefaultWeightedEdge>(DefaultWeightedEdge.class);
    
        g.addVertex(0);
        g.addVertex(1);
        g.addVertex(2);
        g.addVertex(3);
        g.addVertex(4);
        g.addVertex(5);
        DefaultWeightedEdge edge1 = g.addEdge(4, 5);
        g.setEdgeWeight(edge1, 0.8);
        DefaultWeightedEdge edge2 = g.addEdge(3, 4);
        g.setEdgeWeight(edge2, 0.1);
        DefaultWeightedEdge edge3 = g.addEdge(0, 1);
        g.setEdgeWeight(edge3, 0.2);
        DefaultWeightedEdge edge4 = g.addEdge(1, 2);
        g.setEdgeWeight(edge4, 0.3);
        DefaultWeightedEdge edge5 = g.addEdge(2, 3);
        g.setEdgeWeight(edge5, 0.1);
        DefaultWeightedEdge edge6 = g.addEdge(0, 5);
        g.setEdgeWeight(edge6, 0.7);
        DefaultWeightedEdge edge7 = g.addEdge(4, 0);
        g.setEdgeWeight(edge7, 0.7);
        DefaultWeightedEdge edge8 = g.addEdge(4, 1);
        g.setEdgeWeight(edge8, 0.5);
        DefaultWeightedEdge edge9 = g.addEdge(2, 4);
        g.setEdgeWeight(edge9, 12.8);
    
        System.out.println(g.toString());
    
        DijkstraShortestPath<Integer, DefaultWeightedEdge>shortest = 
                new DijkstraShortestPath<Integer, DefaultWeightedEdge>(g, 1, 4);
    
        System.out.println(shortest.getPathEdgeList() );
    

    然后它会输出你所期望的:

    ([0, 1, 2, 3, 4, 5], [(4,5), (3,4), (0,1), (1,2), (2,3), (0,5), (4,0), (4,1), (2,4)])
    [(1 : 2), (2 : 3), (3 : 4)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-13
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2013-05-24
      • 1970-01-01
      相关资源
      最近更新 更多