@Test
void test(){
final int M=10000;
char[] vertices=new char[]{'A','B','C','D'};//顶点
int[][] graph=new int[][]{//A点到其他点的距离
{0,2,M,6},
{2,0,3,2},
{M,3,0,2},
{6,2,2,0}
};
int [] dijkstra=dijkstra(graph,0);
for (int i:dijkstra) {
System.out.println(i);}
}
public static int[] dijkstra(int[][] graph,int start) {
final int length=graph.length;
int[] shortesPathArray=new int[length];//最后要return 这个 里面记录了start位置的节点到其它节点的距离
int[] visitedArray=new int[length];//区分哪些点是看过的 哪些不是 0表示没看过 1表示看过
shortesPathArray[start]=0;//自己到自己的距离为0
visitedArray[start]=1;//表示这个节点是看过的
for (int i = 1; i < length; i++) {//
int k=-1;//记录点的 不知道赋值什么好 ,随便赋值一个 关系不大
int disMin=Integer.MAX_VALUE;//超大距离 数值很大
for (int j = 1; j < length; j++) {
if(visitedArray[j]==0&&graph[start][j]<disMin){//某个点没有看过 并且到start的节点 小于disMin
disMin=graph[start][j];
k=j;
}
}//这个循环是在一堆点中找一个点,这个点的距离 ,离start点最近
//循环完 就找到了在没有看过的 节点中 距离最小的 节点 k,距离是disMin
visitedArray[k]=1;//这个点看过了
shortesPathArray[k]=disMin;//这个k点到start点的距离
for(int index=1;index<length;index++){
if(visitedArray[index]==0 && //这个点没有看过 并且 这个点到start点 的距离, 中间有点 可以中转,距离最小
graph[start][k]+graph[k][index]<graph[start][index]){//以k为中间节点 是否有其他点可达 距离要比直达更短
graph[start][index]=graph[start][k]+graph[k][index];//有中转节点 使得距离最小
}
}
}
return shortesPathArray;
}
如果没有单元测试 把test 函数内容写到main 方法里面