Dijkstra单源最短路算法

本文深入讲解了Dijkstra算法,一种用于解决单源最短路径问题的贪心算法。适用于非负权重的有向或无向图,通过迭代寻找未被访问的最近节点,并更新其到起点的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]);
			}
		}
	}

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

加油!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值