java-利用Jgrapht和Dijkstra算法获取最短路径(一)

1.导入Jgrapht包

 compile group: 'org.jgrapht', name: 'jgrapht-core', version: '1.3.0'

2.实际图

	路径上的数值表示权重

3.代码实现 从A到C的最短路径

package com.test.dijkstra;

import org.jgrapht.GraphPath;
import org.jgrapht.alg.shortestpath.DijkstraShortestPath;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.WeightedMultigraph;

public class MatrixWithJgrapht {
    public static void main(String[] args) {
        //定义顶点
        String[] vertex={"A","B","C","D","E","F"};
        //定义路径从起点到终点:A->B A->D B->C(不考虑双向)
        String[] startVertex={"A","A","B","B","B","C","C","D","E"};
        String[] endVertex=  {"B","D","C","D","E","E","F","E","F"};
        //定义路径的权重:A->B=2 A->D=1 B->C=3
        double[] weight={2,1,3,2,3,1,5,1,2};

        //定义一个权重multiGraph的图谱
        WeightedMultigraph<String, DefaultWeightedEdge> weightedGraph = new WeightedMultigraph<>(DefaultWeightedEdge.class);
        //1.添加顶点
        for (String s : vertex) {
            weightedGraph.addVertex(s);
        }
        //2.添加边
        for (int i = 0; i < startVertex.length; i++) {
            DefaultWeightedEdge defaultWeightedEdge = weightedGraph.addEdge(startVertex[i], endVertex[i]);
            weightedGraph.setEdgeWeight(defaultWeightedEdge,weight[i]);
        }
        //3.初始化Dijkstra矩阵(迪杰斯特算法后面有时间再另外补充一篇)
        DijkstraShortestPath<String, DefaultWeightedEdge> dijkstra = new DijkstraShortestPath<>(weightedGraph);

        //4.获取最短路径
        GraphPath<String, DefaultWeightedEdge> path = dijkstra.getPath("A", "C");
        for (DefaultWeightedEdge defaultWeightedEdge : path.getEdgeList()) {
            System.out.println(defaultWeightedEdge.toString());
        }

    }
}

4.输出结果

(A : D)
(D : E)
(C : E)

5.为什么结果不是:(A:D)(D:E)(E:C)

	因为定义的图谱是:WeightedMultigraph 不区分方向 :所以E:C和C:E指相同的路径 且只定义了C:E路径
	  //定义路径从起点到终点:A->B A->D B->C(不考虑双向)
    String[] startVertex={"A","A","B","B","B",  "C",     "C","D","E"};
    String[] endVertex=  {"B","D","C","D","E"   ,"E",    "F","E","F"};
    
	可以用DirectedWeightedMultigraph定义双向的图谱
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值