图如下,用代码求出指定顶点任意顶点的最短距离
static int [] dijkstra(int weight[][],int start){
int length = weight.length;//声明length来保存顶点个数
int shortPath [] = new int[length];//保存到每个点的权重,也就是距离
shortPath[0] = 0;
int visited[] = new int[length];//标记已访问的点
visited[0] = 1;
for(int i = 1;i<length;i++){
int k = -1;
int d = Integer.MAX_VALUE;
for(int i1 = 0 ;i1<length;i1++){
if(visited[i1]==0&weight[start][i1]<d){
d = weight[start][i1];
k = i1;
}
}
shortPath[k] = d;
visited[k] = 1;
for(int i2 = 0;i2<length;i2++){
if(visited[i2]==0&weight[start][k]+weight[k][i2]<weight[start][i2]){
weight[start][i2] = weight[start][k]+weight[k][i2];
}
}
}
return shortPath;
}
在主方法里测试下:
static final int MAX = 3000;
public static void main(String args[]){
int weight[][] = {
{0,2,3,MAX,MAX,MAX},
{2,0,MAX,4,MAX,MAX},
{3,MAX,0,2,MAX,MAX},
{MAX,4,2,0,7,MAX,},
{MAX,MAX,MAX,7,0,10},
{MAX,MAX,MAX,MAX,10,0}
};
int temp[] = dijkstra(weight,0);
for(int i = 0 ;i<temp.length;i++){
System.out.println(temp[i]);
}
}
v0到v0~v5的最短距离依此为0,2,3,5,12,22
显然测试正确了。
下面代码和以上代码一样,仅增加了执行过程的输出,便于知道算法执行过程:
static int [] dijkstra(int weight[][] ,int start){
int length = weight.length;
int shortPath[] = new int[length];
shortPath[0] = 0;
int visited[] = new int[length];
visited[0] = 1;
for(int i = 1;i<length;i++){
System.out.printf("第%d次循环\n",i);
System.out.println("_________________________________________________________");
int k = -1;
int d = Integer.MAX_VALUE;
System.out.print("\t进入内循环1\n");
for(int i1 = 0;i1<length;i1++){
System.out.printf("\t 判断:visited[i1]==0&weight[start][i1]<d ,即visited[%d]==0&weight[%d][%d]<%d\n",i1,start,i1,d);
if(visited[i1]==0&weight[start][i1]<d){
d = weight[start][i1];
k = i1;
System.out.println("\t\t条件成立");
System.out.printf("\t\t令d = weight[%d][%d]\n",start,i1);
System.out.printf("\t\t令k=i1,即k=%d\n",i1);
}else{
System.out.println("\t\t条件不成立,跳过");
}
}
shortPath[k] = d;
visited[k] = 1;
System.out.print("\t进入内循环2\n");
for(int i2 = 0;i2<length;i2++){
System.out.printf("\t 判断:visited[%d]==0&weight[%d][%d]+weight[%d][%d]<weight[%d][%d]\n",i2,start,k,k,i2,start,i2);
if(visited[i2]==0&weight[start][k]+weight[k][i2]<weight[start][i2]){
System.out.println("\t\t条件成立");
weight[start][i2] = weight[start][k]+weight[k][i2];
System.out.printf("\t\t令weight[%d][%d] = weight[%d][%d]+weight[%d][%d]\n",start,i2,start,k,k,i2);
}else{
System.out.println("\t\t条件不成立,跳过");
}
}
System.out.println("_________________________________________________________\n\n");
}
return shortPath;
}