目录

floyd

-dijkstra


floyd

floyd:用来求所有顶点之间的最短路径问题,求最短路径具体节点顺序,求各点之间最短路径长度

理解floyd:

  1. 二维矩阵图,就是不断通过测试新的节点k,看看k节点能不能作为中间节点优化各点之间的最短距离
  2. 用动态规划来理解,floyd就是从f[0][i][j]去推求出f[k][i][j],(表示i与j之间允许通过编号为1 ...k的节点的最短路径)
    1. dp[k][i][j] = Min(f[k-1][i][j],f[k-1][i][k]+f[k-1][k][j])
    2. a[i][j] = Math.min(a[i][j], a[i][k] + a[k][j]);

Floyd-Warshall算法的时间复杂度为O(N^3),空间复杂度为O(N^2)。

图最短路径算法之弗洛伊德算法(Floyd) | Echo Blog

核心代码

private void floyd() { for (int k = 0; k < n; k++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = Math.min(a[i][j], a[i][k] + a[k][j]); } } } // 打印 for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { System.out.println(i + " " + j + ":" + a[i][j]); } } }

如何记录最短路径呢?

利用path

如果利用k顶点,A矩阵更新了,则在path[i][j]=k

dijkstra

 dijkstra的目标:从节点start 出发到其他所有节点的最短路径

王道:

1.在堆里面加入的是{id,temp_dis},因为这个temp_dis如果不是最小的,反正会根据disjkra的算法执行下去,会出现同一个id但是dis是真正最短距离的节点,然后真正最短距离的{id,dis}后进来也会先出去。利用vis,就把之前的{id,temp_dis}给忽略了

模板1----力扣

class Solution {int N = 110, M = 6010;// 邻接表int[] he = new int[N], e = new int[M], ne = new int[M], w = new int[M];// dist[x] = y 代表从「源点/起点」到 x 的最短距离为 yint[] dist = new int[N];// 记录哪些点已经被更新过boolean[] vis = new boolean[N];int n, k, idx;int INF = 0x3f3f3f3f;void add(int a, int b, int c) {e[idx] = b;ne[idx] = he[a];he[a] = idx;w[idx] = c;idx++;}public int networkDelayTime(int[][] ts, int _n, int _k) {n = _n; k = _k;// 初始化链表头Arrays.fill(he, -1);// 存图for (int[] t : ts) {int u = t[0], v = t[1], c = t[2];add(u, v, c);}// 最短路dijkstra();// 遍历答案int ans = 0;for (int i = 1; i <= n; i++) {ans = Math.max(ans, dist[i]);}return ans > INF / 2 ? -1 : ans;}void dijkstra() {// 起始先将所有的点标记为「未更新」和「距离为正无穷」Arrays.fill(vis, false);Arrays.fill(dist, INF);// 只有起点最短距离为 0dist[k] = 0;// 使用「优先队列」存储所有可用于更新的点// 以 (点编号, 到起点的距离) 进行存储,优先弹出「最短距离」较小的点PriorityQueue<int[]> q = new PriorityQueue<>((a,b)->a[1]-b[1]);q.add(new int[]{k, 0});while (!q.isEmpty()) {// 每次从「优先队列」中弹出int[] poll = q.poll();int id = poll[0], step = poll[1];// 如果弹出的点被标记「已更新」,则跳过if (vis[id]) continue;// 标记该点「已更新」,并使用该点更新其他点的「最短距离」vis[id] = true;for (int i = he[id]; i != -1; i = ne[i]) {int j = e[i];if (dist[j] > dist[id] + w[i]) {dist[j] = dist[id] + w[i];q.add(new int[]{j, dist[j]});}}}}
}作者:宫水三叶
链接:https://leetcode.cn/problems/network-delay-time/solutions/910056/gong-shui-san-xie-yi-ti-wu-jie-wu-chong-oghpz/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

模板2

1.用最小堆优化过

2.distTo[i]是最终确定的,从起点到i的最短距离

3.用disTo[i]是否<,来代替visite[]

3.State.disFromStart是过程中不断记录的当前到点的路径距离

class State {// 图节点的 idint id;// 从 start 节点到当前节点的距离int distFromStart;State(int id, int distFromStart) {this.id = id;this.distFromStart = distFromStart;}
}// 返回节点 from 到节点 to 之间的边的权重
int weight(int from, int to);// 输入节点 s 返回 s 的相邻节点
List<Integer> adj(int s);// 输入一幅图和一个起点 start,计算 start 到其他节点的最短距离
int[] dijkstra(int start, List<Integer>[] graph) {// 图中节点的个数int V = graph.length;// 记录最短路径的权重,你可以理解为 dp table// 定义:distTo[i] 的值就是节点 start 到达节点 i 的最短路径权重int[] distTo = new int[V];// 求最小值,所以 dp table 初始化为正无穷Arrays.fill(distTo, Integer.MAX_VALUE);// base case,start 到 start 的最短距离就是 0distTo[start] = 0;// 优先级队列,distFromStart 较小的排在前面Queue<State> pq = new PriorityQueue<>((a, b) -> {return a.distFromStart - b.distFromStart;});// 从起点 start 开始进行 BFSpq.offer(new State(start, 0));while (!pq.isEmpty()) {State curState = pq.poll();int curNodeID = curState.id;int curDistFromStart = curState.distFromStart;if (curDistFromStart > distTo[curNodeID]) {// 已经有一条更短的路径到达 curNode 节点了continue;}// 将 curNode 的相邻节点装入队列for (int nextNodeID : adj(curNodeID)) {// 看看从 curNode 达到 nextNode 的距离是否会更短int distToNextNode = distTo[curNodeID] + weight(curNodeID, nextNodeID);if (distTo[nextNodeID] > distToNextNode) {// 更新 dp tabledistTo[nextNodeID] = distToNextNode;// 将这个节点以及距离放入队列pq.offer(new State(nextNodeID, distToNextNode));}}}return distTo;
}

最短路径-dijkstra/floyd相关推荐

  1. 最短路径-Dijkstra算法与Floyd算法

    最短路径-Dijkstra算法与Floyd算法 原文:https://www.cnblogs.com/smile233/p/8303673.html 一.最短路径 ①在非网图中,最短路径是指两顶点之间 ...

  2. 最短路径Dijkstra算法和Floyd算法整理、

    转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径-Dijkstra算法和Floyd算法 Dijks ...

  3. 最短路径——Dijkstra算法与Floyd算法

    最短路径 Dijkstra算法 C语言代码实现 代码解析 Floyd算法 算法解析 C语言代码实现 最短路径问题 最短路径问题是我们经常会面临的一种决策问题.在图论中,非网图(边没有权值)的最短路径就 ...

  4. 最短路径——Dijkstra算法HDU Today(hdu2112)

    关于本题的floyd解法:http://blog.csdn.net/sm9sun/article/details/53282826 上篇博文介绍了floyd解决最短路径的方法,然而由于floyd极大的 ...

  5. 最短路问题(Bellman/Dijkstra/Floyd)

    最短路问题(Bellman/Dijkstra/Floyd) 寒假了,继续学习停滞了许久的算法.接着从图论开始看起,之前觉得超级难的最短路问题,经过两天的苦读,终于算是有所收获.把自己的理解记录下来,可 ...

  6. 最短路径之Floyd(弗洛伊德)算法,以及显示完整路径

    简介: Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学 ...

  7. 最短路径问题---Floyd算法详解

    前言 Genius only means hard-working all one's life. Name:Willam Time:2017/3/8 1.最短路径问题介绍 问题解释: 从图中的某个顶 ...

  8. 最短路径 Dijkstra算法

    小博今天又给大家更新了,最近学习过程中在最短路径问题上被两个比较--我们暂且认定比较恶心的算法难倒了好一会,不过最后还是攻克了,在这里小博写下自己的心得和大家分享一下 **最短路径:**网路中两个不同 ...

  9. 分支限界法:单源最短路径--dijkstra算法

    单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...

最新文章

  1. vector相关习题
  2. ie,火狐下滚动条的问题
  3. OpenGL Single Point单点移动三角形的实例
  4. 【面试必备】奉上最通俗易懂的XGBoost、LightGBM、BERT、XLNet原理解析
  5. SpringBoot2.0系列(2)---SpringBoot之使用Thymeleaf视图模板
  6. Linux的运行级别和chkconfig用法
  7. 丁仲礼院士:深入理解碳中和的基本逻辑和技术需求
  8. Vue Cli3 模拟后台json接口
  9. Java IO基础知识
  10. (浙大-19-夏-数据结构学习笔记)二叉树的初步认识
  11. 如何协助企业IT架构转型
  12. c++/c/java数据结构--队列
  13. 网络发现自动关闭不能启用、无法启用文件和打印共享的解决办法
  14. Unity框架——MVC框架
  15. RabbitMQ的mandatory参数测试
  16. 一九产业AI速写:工业篇
  17. 跟着老猫来搞GO-内建容器Map
  18. 名悦集团:开车从不追尾,老司机分享驾驶避免事故小知识
  19. 408计算机组成原理大题方向,2019考研408计算机组成原理选择题及答案(36)
  20. python程序设计基础山东联盟课后答案_Python程序设计基础(山东联盟)答案2020...

热门文章

  1. 小程序尺寸单位 rpx 和 px 的换算
  2. Flex实现元素的水平居中和垂直居中
  3. Excel自动组卷系统使用教程
  4. HTTP状态码401和403的区别
  5. 优化算法——拟牛顿法之BFGS算法
  6. linux 文件夹同步备份软件下载,rsync从linux到linux的文件同步备份方法_rsync在linux下同步备份教程_飞翔教程...
  7. NameNode和SecondaryNameNode
  8. 外汇交易中的风险管理
  9. Verilog之4bit加减法器的设计并实现
  10. ENVI5.3安装教程(含软件,仅用于学习试用)