Dijkstra算法


说明:求解从起点到任意点的最短距离,注意该算法应用于没有负边的图。

来,看图。

用邻接矩阵表示

       int[][] m = {
{0, 0, 0, 0, 0, 0},
{0, 0, 4, 2, 0, 0},
{0, 0, 0, 3, 2, 3},
{0, 0, 1, 0, 4, 5},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0}};

备注:第一行(从第零行开始)表示A,第一列(从第零列开始)表示A。m[1][2]表示A到B的距离,如果没有相连则赋值为0。

首先用dist[i]数组表示从起点到该点的距离,比如dist[3]表示起点A到点C的距离。先全部初始化为无穷大,把起点初始化为0,因为自己到自己距离为0。接下来把所有的点的距离放入一个优先队列。步骤:

遍历直到队列为空:

在优先队列中删除值(dist[i])最小的点,不过记得保存下来,然后看与其相邻的点的距离,如果相邻的点的距离大于该点距离加上该点到相邻点的距离,则改变相邻的点的距离为该点距离加上该点到相邻点的距离,在优先队列中改变这个相邻的点的距离就好了。

解释:就是宽度优先搜索的变形,宽度优先搜索是直接从队列取出来就好了,没有优先顺序,而这个是根据该点的距离值(就是从起点到该点的距离)来确定优先出队顺序。

在这里优先队列实现的方案有四种:数组,二分堆,d堆,Fibonacci堆。复杂度可以自己去分析一下。提示:你可以计算从队列中删除和加入,复杂度分别是多少,就很容易算出来了。在这里说下数组的吧,从数组中删除最小的:o(V),插入:o(1),总:o(v^2)

来,看下我的代码实现。我是用的map,复杂度与数组实现类似。

import java.util.*;

public class Main {

    public static int deleteMin(Map<Integer, Integer> map) {
int min = Integer.MAX_VALUE;
for (int num : map.values()) {
min = Math.min(min, num);
}
int u = 0;
for (int num : map.keySet()) {
if (map.get(num) == min) {
u = num;
break;
}
}
map.remove(u);
return u;
} public static void dijkstra(int[][] m) {
int n = m.length;
int[] dist = new int[n + 1];
int[] pre = new int[n + 1];
for (int i = 0; i < n; i++) dist[i] = Integer.MAX_VALUE;
dist[1] = 0;
pre[1] = 1;
//点与距离
Map<Integer, Integer> map = new HashMap<>();
for (int i = 1; i < n; i++) {
map.put(i, dist[i]);
}
while (!map.isEmpty()) {
int u = deleteMin(map);
for (int i = 1; i < n; i++) {
if (m[u][i] > 0) {
if (dist[i] > dist[u] + m[u][i]) {
dist[i] = dist[u] + m[u][i];
pre[i] = u;
map.put(i, dist[i]);
}
}
}
}
for (int i = 1; i < n; i++) {
System.out.println("节点1离节点" + i + "距离是:" + dist[i] + ",节点" + i +"的父节点是;" + pre[i]);
}
} public static void main(String[] args) {
int[][] m = {
{0, 0, 0, 0, 0, 0},
{0, 0, 4, 2, 0, 0},
{0, 0, 0, 3, 2, 3},
{0, 0, 1, 0, 4, 5},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0}};
dijkstra(m); } }

最新文章

  1. request 对象和 response 对象
  2. Hadoop集群搭建安装过程(一)(图文详解---尽情点击!!!)
  3. objective-c系列-NSMutableString
  4. Redis+Spring缓存实例
  5. 整合Spring Data JPA与Spring MVC: 分页和排序
  6. oc_转_NSArrray 和 NSMutableArrray
  7. oschina开源硬件其它开源,开源硬件
  8. AssetBundle.CreateFromFile的有趣事情
  9. CQRS 示例
  10. Linux命令语句秘籍
  11. 》》ajax加蒙版
  12. Time Complexity of Loop with Powers
  13. 从fastjson多层泛型嵌套解析,看jdk泛型推断
  14. Elasticsearch Document
  15. Loj #2494. 「AHOI / HNOI2018」寻宝游戏
  16. Kali Linux NetHunter教程Kali NetHunter支持的设备和ROMs
  17. Javascript高级编程学习笔记(68)—— 事件(12)设备事件
  18. hammer.js方法总结(只做了一个简单的demo)
  19. replace()方法解析
  20. Flask的集中控制

热门文章

  1. css之定位(position)
  2. AMD 和 CMD 的区别
  3. scrolling 优化 避免卡顿
  4. MSSQL 备份数据库还原
  5. Input类型是checkbox时checked属性获取
  6. SQL系统函数的使用(实验五)
  7. 洛谷 P3384 【模板】树链剖分
  8. linux操作系统基础篇(七)
  9. shell全自动登录远程终端
  10. Git文件状态描述