Dijkstra单源最短路算法
适用情况
该算法适用于边权为非负的情况,且最好为稀疏图。目的是求单源最短路。
时间复杂度O()
有向图、无向图可初始化 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]);
}
}
}
如有错误或不合理的地方,敬请指正~
加油!!