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定义双向的图谱