在看了网上啊哈磊的【坐在马桶上看算法】算法7:Dijkstra最短路算法 这篇文章之后,为了巩固印象,自己参照原例写了如下的Java代码:
public class Dijkstra {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int map[][]={{0,1,12,99,99,99}, //初始化路线图,99即代表没有路径到达
{99,0,9,3,99,99},
{99,99,0,99,5,99},
{99,99,4,0,13,15},
{99,99,99,99,0,4},
{99,99,99,99,99,0}};
boolean hasDis[]={true,false,false,false,false,false}; //记录源点1到别的点的距离是否已经过“松弛”
int dis[]=new int[map[0].length]; //该数组用于储存源点到其余各点的最短路径
for(int i=0;i<dis.length;i++){
dis[i]=map[0][i]; //初始化数组dis
}
//以下为Dijkstra算法核心代码
for(int i=1;i<dis.length;i++){
//找到离源点最近的“未松弛”节点
int min=99;
int minPoint=0;//minPoint初始值设为0是否合适还有待商榷……
for(int j=1;j<dis.length;j++){
if(hasDis[j]==false && dis[j]<min){
min=dis[j];
minPoint=j;
}
}
//如果已记录的源点到v点的最短距离大于源点到最近“未松弛”节点与该节点到v点的距离之和,则将记录的最短距离替换
for(int v=0;v<dis.length;v++){
if(map[minPoint][v]<99){
if(dis[v]>dis[minPoint]+map[minPoint][v]){
dis[v]=dis[minPoint]+map[minPoint][v];
}
}
}
//将该节点标记为“已松弛”
hasDis[minPoint]=true;
}
//输出结果
for(int i=0;i<dis.length;i++){
System.out.print(dis[i]+" ");
}
}
}
输出结果为 0 1 8 4 13 17 ,结果正确,但不知道其他输入会不会导致bug,如果有错误希望各位大虾指正