无向图的Dijkstra算法(求任意一对顶点间的最短路径)迪杰斯特拉算法

public class Main{
	
	public static int dijkstra(int[][] w1,int start,int end) {
		
		boolean[] isLable = new boolean[w1[0].length];//是否标上所有的号
		int[] indexs = new int[w1[0].length];//所有标号的下标集合,以标号的先后顺序进行存储。实际上是一个栈
		
		int i_count = -1; //栈的顶点
		int[] distance = w1[start].clone();//以v0到各点的最短距离的初始值
		int index = start;//从初始点开始
		int presentShortest = 0;  //当前临时最短距离
		
		indexs[++i_count] = index; //把已经标号的下标存入下标集中
		isLable[index] = true;
		
		while(i_count<w1[0].length) {
			//第一步:标号v0,即w[0][0]找到距离v0最近的点
			int min = Integer.MAX_VALUE;
			for(int i=0;i<distance.length;i++) {
				if(!isLable[i]&&distance[i]!=-1&&i!=index) {
					//如果到这个点有边,并且没有被标号
					if(distance[i]<min) {
						min = distance[i];
						index = i;//把下标改为当前下标
					}
				}
			}
		
		
			if(index == end) {//已经找到当前点了,就结束程序
				break;
			}
			isLable[index]=true; //对点进行标号
			indexs[++i_count] = index; //把已经标号的下标存入下标集中,入栈
			if(w1[indexs[i_count-1]][index]==-1||presentShortest+w1[indexs[i_count-1]][index]>distance[index]) {
				//如果两个点没有直接相连,或两个点路径大于最短路径
				presentShortest = distance[index];
			}else {
				presentShortest+=w1[indexs[i_count-1]][index];
			}
			
			//第二步:将distance中距离加入vi
			for(int i=0;i<distance.length;i++) {
				//如果vi到那个点有边,则v0到后面点距离增加
				if(distance[i]==-1&&w1[index][i]!=-1) {//如果以前不可达,则现在可达了
					distance[i]=presentShortest+w1[index][i];
				}else if(w1[index][i]!=-1&&presentShortest+w1[index][i]<distance[i]) {
					//如果以前可达,但现在的路径比以前更短,则更换成更短路径
					distance[i] = presentShortest+w1[index][i];
				}
			}
		}
		return distance[end]-distance[start];
	}
	
	
	public static void main(String[] args) {
		
		
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42036647/article/details/84996080