具体的算法详解可以看这篇博客Dijkstra最短路径算法详解。
这里我利用.txt文件存储了有向加权图中顶点之间的连接关系以及边上的权重,文件格式如下:
代码所构造的有向加权图如下:
package Graph;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class AdjMatrix {
public int index; //中转点的索引
public int distance; //最短距离
public boolean flag;
public static ArrayList<Integer> transfer; //中转点数组
private int V; //顶点个数
private int E; //边的个数
private int[][] adj; //邻接矩阵
private int[] dis; //所有点的最短距离
public int findMin(int[] arr) {
flag=false;
int min=(int)Double.POSITIVE_INFINITY;
for(int i=0;i<arr.length;i++) {
if(arr[i]<min&&arr[i]!=0) {
min=arr[i];
index=i;
flag=true;
}
}
return min;
}
public AdjMatrix(String fileName) {
File file=new File(fileName);
try {
Scanner scanner=new Scanner(file);
V=scanner.nextInt();
adj=new int[V][V];
int inf=(int) Double.POSITIVE_INFINITY;
for(int i=0;i<V;i++) {
for(int j=0;j<V;j++) {
if(i!=j)
adj[i][j]=inf;
}
}
E=scanner.nextInt();
for(int i=0;i<E;i++) {
int a=scanner.nextInt();
int b=scanner.nextInt();
int w=scanner.nextInt();
//数组相应位置处有顶点之间连接的赋值为1
adj[a][b]=w;
}
transfer=new ArrayList<>();
transfer.add(0);
dis=new int[V];
for(int i=0;i<V;i++) {
dis[i]=adj[0][i];
}
index=0;
while(true) {
int mindis=findMin(adj[index]);
if(flag==false)
break;
transfer.add(index);
distance+=mindis;
for(int i=0;i<V;i++) {
if(adj[index][i]!=inf) {
dis[i]=distance+adj[index][i];
}
}
}
System.out.println("Minimum distance between points:");
for(int i=0;i<V;i++)
{
System.out.print(dis[i]+" ");
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
AdjMatrix adj=new AdjMatrix("graph.txt");
System.out.println("\nThe apex of the path:");
System.out.println(transfer);
}
}
运行结果如下:
Minimum distance between points:
0 1 8 4 13 17
The apex of the path:
[0, 1, 3, 2, 4, 5]
最短路径如下所示: