Dijkstra单源最短路算法

Dijkstra单源最短路算法

适用情况

该算法适用于边权为非负的情况,且最好为稀疏图目的是求单源最短路。

时间复杂度O(n^{2})

有向图、无向图可初始化 map 数组时进行处理。

思想

该算法采用贪心的策略。

①【找距源点最近点】从一指定的源点开始,然后按某一规则找其他的所有(n-1个)点。该规则是:每次找下一个点的时候,那个点必须是之前没有被找到(存储)的,并且是满足该条件的点中距离源点最近的一个点(找到了则进行下一步,否则退出完成查找)。

②【更新最短距离】定义 dis[ p ] 为找到的那个点与源点的距离,map[ p ][ j ] 为那个点与 j 点之间的距离(事先存好的两点距离)。

那么循环所有的点(循环下标为 j ,即为每个点的编号),每次比较 dis[ j ] 与 dis[ p ] + map[ p ][ j ] 的大小,即比较 原来源点到某点的距离 与 现在经过p点到同一点的距离 大小,最后更新 dis[ j ] 为最小的值。

③【得到结果】所有点被查找过一遍并进行更新一遍后,即得某点到其他所有点的最短距离。


private static void dijkstra(int s) {
		Arrays.fill(f, false); //标记是否走过(存储)
		Arrays.fill(dis, Integer.MAX_VALUE); //保存最短距离
		for(int i=1; i<=n; i++) {
			dis[i] = Math.min(dis[i], map[s][i]);
		}
		
		dis[s] = 0;
		f[s] = true;
		for(int i=0; i<n-1; i++) {
			
			int minx = Integer.MAX_VALUE;
			int p = -1;
			for(int j=1; j<=n; j++) { // 查找最近点
				if(f[j] == false && dis[j] < minx) {
					minx = dis[j];
					p = j;
				}
			}
			if(p == -1)
				break;
			f[p] = true;
			
			for(int j=1; j<=n; j++) { // 更新最短距离
				dis[j] = Math.min(dis[j], dis[p] + map[p][j]);
			}
		}
	}

如有错误或不合理的地方,敬请指正~

加油!!

猜你喜欢

转载自blog.csdn.net/qq_37194492/article/details/89155290
今日推荐