原理
注意他是求一个节点到剩余节点的最短路径
https://www.jianshu.com/p/ff6db00ad866
实现代码
package qiuzhaoprepare;
public class Dijkstra {
public static int M = 10000;
public static void main(String[] args) {
int[][] weight = {
{0,4,M,2,M},
{4,0,4,1,M},
{M,4,0,1,3},
{2,1,1,0,7},
{M,M,3,7,0}
};
int start = 0;
int[] shortPath = dijkstra(weight, start);
for (int i = 0; i < shortPath.length; i++)
System.out.println("从" + start + "出发到" + i + "的最短距离为:" + shortPath[i]);
}
public static int[] dijkstra(int[][] weight, int start) {
int n = weight.length;
int[] visited = new int[n];
int[] shortPath = new int[n];
String[] path = new String[n];
for(int i=0;i<n;i++)
path[i] = new String(start + "-->" + i);
shortPath[0] = 0;
visited[0] = 1;
for(int i=1;i<n;i++) {
int minLen = Integer.MAX_VALUE;
int minNode = -1;
for(int j=0;j<n;j++) {
if(visited[j]==0 && weight[start][j]<minLen) {
minLen = weight[start][j];
minNode = j;
}
}
visited[minNode] = 1;
shortPath[minNode] = minLen;
// 修正最短路径
for(int k=0;k<n;k++) {
if(visited[k]==0 && (weight[start][minNode] + weight[minNode][i] < weight[start][i])) {
weight[start][i] = weight[start][minNode] + weight[minNode][i];
path[k] = path[minNode] + "-->" + k;
}
}
}
for(int i=0;i<n;i++)
System.out.println("从"+start+"到"+i+"最短路径为:"+path[i]);
return shortPath;
}
}