Java图的最短路径算法——dijkstra算法(可观测算法详细执行过程)

图如下,用代码求出指定顶点任意顶点的最短距离
在这里插入图片描述

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;
}
发布了41 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43616178/article/details/94187321