最短路径
迪杰斯特拉算法
路径:
8
15
4 5 0.35
5 4 0.35
4 7 0.37
5 7 0.28
7 5 0.28
5 1 0.32
0 4 0.38
0 2 0.26
7 3 0.39
1 3 0.29
2 7 0.34
6 2 0.40
3 6 0.52
6 0 0.58
6 4 0.93
package Graph;
import javax.print.DocFlavor;
public class EdgeWeightedDigraph {
private final int v; // 顶点数目
private int E; //变得数目
//邻接表
private Queue<WeightedDirectedEdge>[] adj;
//创建一个含有v个顶点的空加权有向图
public EdgeWeightedDigraph(int v){
//初始化顶点数目
this.v = v;
this.E = 0;
this.adj = new Queue[v];
for (int i = 0; i < adj.length; i++) {
adj[i] = new Queue<WeightedDirectedEdge>();
}
}
//获取图中的顶点个数
public int v(){
return v;
}
//获取图中边的数量
public int E(){
return E;
}
//向加权有向图中添加一条边e
public void addEdge(WeightedDirectedEdge e){
adj[e.from()].enqueue(e);
E++;
}
//获取由顶点v指向的所有边
public Queue<WeightedDirectedEdge> adj(int v){
return adj[v];
}
//获取加权有向图的所有边
public Queue<WeightedDirectedEdge> edges(){
Queue<WeightedDirectedEdge> queue = new Queue<WeightedDirectedEdge>();
for (int i = 0; i < adj.length; i++) {
for (WeightedDirectedEdge edges : adj[i]) {
queue.enqueue(edges);
}
}
return queue;
}
}
测试代码:
package Test;
import Graph.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class DijkstraSPTest {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(DijkstraSPTest.class.getClassLoader().getResourceAsStream("min_route_test.txt")));
int total = Integer.parseInt(br.readLine());
EdgeWeightedDigraph G = new EdgeWeightedDigraph(total);
int edgenumbers = Integer.parseInt(br.readLine());
for (int i = 0; i < edgenumbers; i++) {
String line = br.readLine();
String[] strs = line.split(" ");
int v = Integer.parseInt(strs[0]);
int w = Integer.parseInt(strs[1]);
double weight = Double.parseDouble(strs[2]);
WeightedDirectedEdge e = new WeightedDirectedEdge(v, w, weight);
G.addEdge(e);
}
DijkstraSP dijkstraSP = new DijkstraSP(G, 0);
Queue<WeightedDirectedEdge> edges = dijkstraSP.pathTo(6);
//遍历打印
for (WeightedDirectedEdge edge : edges) {
System.out.println(edge.from() + "->" + edge.to() + " : " + edge.weight());
}
}
}