jgrapht将现有边添加到图形<defaultdirectedweightedgraph>

时间:2016-03-22 20:34:20

标签: java dijkstra jgrapht

我想创建一个有向加权图,然后通过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>},而不是1-> 2&gt; 3

我知道在addEdge Jdocument中它表示如果图中另一条边具有相同的权重,则无法为图形添加边。 有没有办法围绕这个?

1 个答案:

答案 0 :(得分:0)

问题是您使用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)]
相关问题