图论-最短路径-Dijkstra

单源、无负权(会出现负值圈)可打印路径的模版:O(n^2)

Dijkstra求解是一个点一旦已经访问了,后续即使有从起点到该点更短的路径,也无法更新了。所以不适合有负权的图。如下图:1->2的最短路径应该是1->3->2,而不是1->2。实质:贪心

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 10000;
  4. const int inf = 1e9;
  5. int n, G[maxn][maxn], m;//n个点,m条边
  6. int dis[maxn], path[maxn];
  7. bool vis[maxn]={false};
  8. void Dijkstra(int s)
  9. {
  10. for(int i = 0; i < n; i++)
  11. {
  12. dis[i] = G[s][i];
  13. if(G[s][i] != inf) path[i] = s;
  14. else path[i] = -1;
  15. }
  16. dis[s] = 0;//起点距离自身为0
  17. for(int i = 0; i < n; i++)//循环n次,或者令vis[s]=1,循环n-1次
  18. {
  19. int u = -1, minn = inf;
  20. for(int j = 0; j < n; j++)
  21. {
  22. if(!vis[j] && dis[j] < minn)
  23. {
  24. u = j;
  25. minn = dis[j];//找未访问过的最短的距离
  26. }
  27. }
  28. if(u == -1) break;//不连通
  29. vis[u] = true;
  30. for(int v = 0; v < n; v++)
  31. {
  32. //从该点出发更新其他点到起点的距离
  33. if(!vis[v] && dis[u] + G[u][v] < dis[v])
  34. {
  35. dis[v] = dis[u] + G[u][v];
  36. path[v] = u;//可输出路径
  37. }
  38. }
  39. }
  40. }
  41. void displayPath(int e)
  42. {
  43. vector<int> p;
  44. printf("0-->%d 距离:%d\n路径为:",e, dis[e]);
  45. p.push_back(e);
  46. int pre = path[e];
  47. while(pre != -1)
  48. {
  49. p.push_back(pre);
  50. pre = path[pre];
  51. }
  52. for(int i = p.size() - 1; i >0; i--)
  53. printf("%d-->", p[i]);
  54. printf("%d\n", p[0]);
  55. }
  56. int main()
  57. {
  58. freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
  59. ios::sync_with_stdio(false);
  60. cin.tie(nullptr);
  61. cout.tie(nullptr);
  62. cin >> n >> m;
  63. int x, y, z;
  64. fill(G[0],G[0]+maxn*maxn,inf);//全都初始化不可达到
  65. for(int i = 0; i < m; i++)
  66. {
  67. cin >> x >> y >> z;
  68. G[x][y] = G[y][x] = z;
  69. }
  70. Dijkstra(0);
  71. for(int i = 0; i < n; i++)
  72. displayPath(i);
  73. return 0;
  74. }

图论-最短路径-Floyd

多源,无环,无负权:O(n^3)  实质:动态规划

再考虑顶点2和3,更新距离和路径

路径的求解原理:

路径的求解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 10000;
  4. const int inf = 1e9;
  5. int n,m;
  6. int dis[maxn][maxn], path[maxn][maxn], edges[maxn][maxn];
  7. void Floyd()
  8. {
  9. for(int i = 0; i < n; i++)
  10. {
  11. for(int j = 0; j < n; j++)
  12. {
  13. if(i == j) dis[i][j] = 0;//i==j需要特殊处理一下
  14. else dis[i][j] = edges[i][j];
  15. //注意i != j,因为是多源,不能像Dijkstra那样把起点的path设成-1
  16. if(i != j && dis[i][j] != inf) path[i][j] = i;
  17. else path[i][j] = -1;
  18. }
  19. }
  20. for(int k = 0; k < n; k++)
  21. {
  22. for(int i = 0; i < n; i++)
  23. {
  24. for(int j = 0; j < n; j++)
  25. {
  26. if(dis[i][k] + dis[k][j] < dis[i][j])
  27. {
  28. dis[i][j] = dis[i][k] + dis[k][j];
  29. path[i][j] = path[k][j];
  30. }
  31. }
  32. }
  33. }
  34. }
  35. int main()
  36. {
  37. //freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
  38. ios::sync_with_stdio(false);
  39. cin.tie(nullptr);
  40. cout.tie(nullptr);
  41. cin >> n >> m;
  42. int x, y, z;
  43. fill(edges[0],edges[0]+maxn*maxn,inf);//全都初始化不可达到
  44. for(int i = 0; i < m; i++)
  45. {
  46. cin >> x >> y >> z;
  47. edges[x][y] = edges[y][x] = z;
  48. }
  49. Floyd();
  50. for(int i = 0; i < n; i++)
  51. printf("dis[0][%d]: %d\n", i, dis[0][i]);
  52. return 0;
  53. }

图论-最短路径-SPFA(队列优化的Bellman-Ford)

不适合负权回路的图,单源最短路:O(e)-O(ne) e为边数

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 10000;
  4. const int inf = 1e9;
  5. int n,m;
  6. int dis[maxn], path[maxn], vis[maxn];
  7. struct node{
  8. int Next,val;
  9. };
  10. vector<node> edges[maxn];
  11. queue<int> q;
  12. void spfa(int s)
  13. {
  14. for(int i = 0; i < n; i++)
  15. {
  16. dis[i] = inf;
  17. path[i] = -1;
  18. }
  19. dis[s] = 0;//自己到自己0
  20. vis[s] = 1;
  21. q.push(s);
  22. while(!q.empty())
  23. {
  24. int u = q.front();
  25. q.pop();
  26. vis[u] = 0;
  27. for(int i = 0; i < edges[u].size(); i++)//松弛和自己相邻的边
  28. {
  29. int v = edges[u][i].Next, weight = edges[u][i].val;
  30. if(dis[u] + weight < dis[v])
  31. {
  32. dis[v] = dis[u] + weight;
  33. path[v] = u;
  34. if(!vis[v])
  35. {
  36. vis[v] = 1;
  37. q.push(v);
  38. }
  39. }
  40. }
  41. }
  42. }
  43. int main()
  44. {
  45. //freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
  46. ios::sync_with_stdio(false);
  47. cin.tie(nullptr);
  48. cout.tie(nullptr);
  49. cin >> n >> m;
  50. int x, y, z;
  51. for(int i = 0; i < m; i++)
  52. {
  53. cin >> x >> y >> z;
  54. edges[x].push_back({y,z});
  55. edges[y].push_back({x,z});
  56. }
  57. spfa(0);
  58. for(int i = 0; i < n; i++)
  59. printf("dis[%d]:%d\n",i, dis[i]);
  60. return 0;
  61. }

【算法笔记】最短路-Dijkstra、Floyd、SPFA模版总结+复习相关推荐

  1. 详解最短路算法模板(dijkstra+floyd+spfa)

    1.Floyd_Warshall算法 核心思路:d[i][j] = min{d[i][j], d[i][k] + d[k][j]} 从i到j有两种路径,经过k点或是不经过k点,所以我们枚举k即可求所有 ...

  2. HDU2544 最短路(模版题dijkstra/floyd/spfa)

    Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要 ...

  3. HDU 1874 畅通工程续 (Dijkstra , Floyd , SPFA, Bellman_Ford 四种算法)

    畅通工程续 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修 ...

  4. 最短路Dijkstra+Floyd

    目录 Dijkstra Dijkstra模板 eg: Floyd Floyd模板 eg1: eg2:删点游戏 笔记: Dijkstra n<m时未优化算法更快(n*n+m)<  ((n+m ...

  5. 图论算法讲解--最短路--Dijkstra算法

    一.绪论 要学习最短路算法我们首先应该知道什么是图以及什么是最短路. 图在离散数学中的定义为:图G=(V,E)是一个二元组(V,E)使得E⊆[V]的平方,所以E的元素是V的2-元子集.为了避免符号上的 ...

  6. Dijkstra 算法的实现(算法笔记)

    算法笔记:  1) Dijkstra 算法的伪代码: /**1) Dijkstra 算法的伪代码:void Dijkstra(G,d[],s){初始化:for(循环 n 次){u=使d[u] 最小的还 ...

  7. 最短路算法详解(Dijkstra/SPFA/Floyd)

    转自:http://blog.csdn.net/murmured/article/details/19281031 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短 ...

  8. 03 最短路 dijkstra算法spfa算法floyd算法(附带实例代码) 图论-1

    文章目录 最短路 邻接表的图如下 邻接矩阵如下图 链表实现邻接表实现代码 单源最短路径 Dijkstra 算法 朴素版本 Dijkstra 实现代码 堆优化的dijkstra算法代码实现 Bellma ...

  9. 最短路合集(Dijkstra、SPFA、Floyd以及路径还原模板)

    目录 一.Dijkstra算法(不能处理存在负权的清况) 1.堆(优先队列)优化版本:(慢,占用内存还大) 2.普通线段树优化版本(一般块) 2.大佬的特殊线段树优化版本:(超快的) 二.SPFA 算 ...

  10. hdu1874 畅通project续 最短路 floyd或dijkstra或spfa

    Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择.而某些方案 ...

最新文章

  1. error undefined reference to __android_log_print
  2. CE5.0 - romimage.exe如何填充eboot.bin中的pTOC特殊指针生成.nb0
  3. 程序员发现 Bug 的时候是怎样一种心境?
  4. c语言字符串67ASDSff,(指针编程题目.doc
  5. Appium Python 六:管理应用和Activity
  6. koa2 mysql增删改查_react+koa2+mysql零门槛的全栈体验,附上完整项目分享
  7. 最简单的基于FFMPEG的推流器附件:收流器
  8. 点击编辑,进入编辑页面并把值渲染到页面上
  9. phpquery抓取网站内容简单介绍
  10. 图扑智慧交通:数字化地铁大屏管控运维平台
  11. 简单好用的Mac截图工具:FinalShot
  12. Mac本换ssd注意事项
  13. springboot异步调用demo
  14. 平实给力的写作指导入门手册——leo鉴书57
  15. YYLabel的几个实用小技巧
  16. .fla文件的链接类在.swf中的体现
  17. Bitbucket使用说明与SourceTree的使用
  18. 一个很好的机会股票的价格是向南移动
  19. Kingbase兼容Oracle语法--连接操作符(+)
  20. 计算机ppt格式化在哪里,计算机安装与维护8(分区、格式化)ppt课件.ppt

热门文章

  1. 千万不能返回局部变量的引用
  2. 1到9排序php,php通过排列组合实现1到9数字相加都等于20的方法,php排列组合_PHP教程...
  3. mysql 联合索引底层结构_MySQL联合索引底层数据结构
  4. centos wget默认路径_TRMM 数据windows平台wget下载方法(2021年1月13日可用)
  5. android surfaceview , videoview 背景加圆角
  6. 日期格式 java_Java日期格式转换
  7. swagger整合springMVC
  8. 【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价
  9. sublime text3 eslint 安装教程
  10. /etc/hosts/中HOSTNAME错误导致SETUP出错