【算法笔记】最短路-Dijkstra、Floyd、SPFA模版总结+复习
图论-最短路径-Dijkstra
单源、无负权(会出现负值圈)可打印路径的模版:O(n^2)
Dijkstra求解是一个点一旦已经访问了,后续即使有从起点到该点更短的路径,也无法更新了。所以不适合有负权的图。如下图:1->2的最短路径应该是1->3->2,而不是1->2。实质:贪心
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 10000;
- const int inf = 1e9;
- int n, G[maxn][maxn], m;//n个点,m条边
- int dis[maxn], path[maxn];
- bool vis[maxn]={false};
- void Dijkstra(int s)
- {
- for(int i = 0; i < n; i++)
- {
- dis[i] = G[s][i];
- if(G[s][i] != inf) path[i] = s;
- else path[i] = -1;
- }
- dis[s] = 0;//起点距离自身为0
- for(int i = 0; i < n; i++)//循环n次,或者令vis[s]=1,循环n-1次
- {
- int u = -1, minn = inf;
- for(int j = 0; j < n; j++)
- {
- if(!vis[j] && dis[j] < minn)
- {
- u = j;
- minn = dis[j];//找未访问过的最短的距离
- }
- }
- if(u == -1) break;//不连通
- vis[u] = true;
- for(int v = 0; v < n; v++)
- {
- //从该点出发更新其他点到起点的距离
- if(!vis[v] && dis[u] + G[u][v] < dis[v])
- {
- dis[v] = dis[u] + G[u][v];
- path[v] = u;//可输出路径
- }
- }
- }
- }
- void displayPath(int e)
- {
- vector<int> p;
- printf("0-->%d 距离:%d\n路径为:",e, dis[e]);
- p.push_back(e);
- int pre = path[e];
- while(pre != -1)
- {
- p.push_back(pre);
- pre = path[pre];
- }
- for(int i = p.size() - 1; i >0; i--)
- printf("%d-->", p[i]);
- printf("%d\n", p[0]);
- }
- int main()
- {
- freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- cin >> n >> m;
- int x, y, z;
- fill(G[0],G[0]+maxn*maxn,inf);//全都初始化不可达到
- for(int i = 0; i < m; i++)
- {
- cin >> x >> y >> z;
- G[x][y] = G[y][x] = z;
- }
- Dijkstra(0);
- for(int i = 0; i < n; i++)
- displayPath(i);
- return 0;
- }
图论-最短路径-Floyd
多源,无环,无负权:O(n^3) 实质:动态规划
再考虑顶点2和3,更新距离和路径
路径的求解原理:
路径的求解:
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 10000;
- const int inf = 1e9;
- int n,m;
- int dis[maxn][maxn], path[maxn][maxn], edges[maxn][maxn];
- void Floyd()
- {
- for(int i = 0; i < n; i++)
- {
- for(int j = 0; j < n; j++)
- {
- if(i == j) dis[i][j] = 0;//i==j需要特殊处理一下
- else dis[i][j] = edges[i][j];
- //注意i != j,因为是多源,不能像Dijkstra那样把起点的path设成-1
- if(i != j && dis[i][j] != inf) path[i][j] = i;
- else path[i][j] = -1;
- }
- }
- for(int k = 0; k < n; k++)
- {
- for(int i = 0; i < n; i++)
- {
- for(int j = 0; j < n; j++)
- {
- if(dis[i][k] + dis[k][j] < dis[i][j])
- {
- dis[i][j] = dis[i][k] + dis[k][j];
- path[i][j] = path[k][j];
- }
- }
- }
- }
- }
- int main()
- {
- //freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- cin >> n >> m;
- int x, y, z;
- fill(edges[0],edges[0]+maxn*maxn,inf);//全都初始化不可达到
- for(int i = 0; i < m; i++)
- {
- cin >> x >> y >> z;
- edges[x][y] = edges[y][x] = z;
- }
- Floyd();
- for(int i = 0; i < n; i++)
- printf("dis[0][%d]: %d\n", i, dis[0][i]);
- return 0;
- }
图论-最短路径-SPFA(队列优化的Bellman-Ford)
不适合负权回路的图,单源最短路:O(e)-O(ne) e为边数
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 10000;
- const int inf = 1e9;
- int n,m;
- int dis[maxn], path[maxn], vis[maxn];
- struct node{
- int Next,val;
- };
- vector<node> edges[maxn];
- queue<int> q;
- void spfa(int s)
- {
- for(int i = 0; i < n; i++)
- {
- dis[i] = inf;
- path[i] = -1;
- }
- dis[s] = 0;//自己到自己0
- vis[s] = 1;
- q.push(s);
- while(!q.empty())
- {
- int u = q.front();
- q.pop();
- vis[u] = 0;
- for(int i = 0; i < edges[u].size(); i++)//松弛和自己相邻的边
- {
- int v = edges[u][i].Next, weight = edges[u][i].val;
- if(dis[u] + weight < dis[v])
- {
- dis[v] = dis[u] + weight;
- path[v] = u;
- if(!vis[v])
- {
- vis[v] = 1;
- q.push(v);
- }
- }
- }
- }
- }
- int main()
- {
- //freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- cin >> n >> m;
- int x, y, z;
- for(int i = 0; i < m; i++)
- {
- cin >> x >> y >> z;
- edges[x].push_back({y,z});
- edges[y].push_back({x,z});
- }
- spfa(0);
- for(int i = 0; i < n; i++)
- printf("dis[%d]:%d\n",i, dis[i]);
- return 0;
- }
【算法笔记】最短路-Dijkstra、Floyd、SPFA模版总结+复习相关推荐
- 详解最短路算法模板(dijkstra+floyd+spfa)
1.Floyd_Warshall算法 核心思路:d[i][j] = min{d[i][j], d[i][k] + d[k][j]} 从i到j有两种路径,经过k点或是不经过k点,所以我们枚举k即可求所有 ...
- HDU2544 最短路(模版题dijkstra/floyd/spfa)
Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要 ...
- HDU 1874 畅通工程续 (Dijkstra , Floyd , SPFA, Bellman_Ford 四种算法)
畅通工程续 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修 ...
- 最短路Dijkstra+Floyd
目录 Dijkstra Dijkstra模板 eg: Floyd Floyd模板 eg1: eg2:删点游戏 笔记: Dijkstra n<m时未优化算法更快(n*n+m)< ((n+m ...
- 图论算法讲解--最短路--Dijkstra算法
一.绪论 要学习最短路算法我们首先应该知道什么是图以及什么是最短路. 图在离散数学中的定义为:图G=(V,E)是一个二元组(V,E)使得E⊆[V]的平方,所以E的元素是V的2-元子集.为了避免符号上的 ...
- Dijkstra 算法的实现(算法笔记)
算法笔记: 1) Dijkstra 算法的伪代码: /**1) Dijkstra 算法的伪代码:void Dijkstra(G,d[],s){初始化:for(循环 n 次){u=使d[u] 最小的还 ...
- 最短路算法详解(Dijkstra/SPFA/Floyd)
转自:http://blog.csdn.net/murmured/article/details/19281031 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短 ...
- 03 最短路 dijkstra算法spfa算法floyd算法(附带实例代码) 图论-1
文章目录 最短路 邻接表的图如下 邻接矩阵如下图 链表实现邻接表实现代码 单源最短路径 Dijkstra 算法 朴素版本 Dijkstra 实现代码 堆优化的dijkstra算法代码实现 Bellma ...
- 最短路合集(Dijkstra、SPFA、Floyd以及路径还原模板)
目录 一.Dijkstra算法(不能处理存在负权的清况) 1.堆(优先队列)优化版本:(慢,占用内存还大) 2.普通线段树优化版本(一般块) 2.大佬的特殊线段树优化版本:(超快的) 二.SPFA 算 ...
- hdu1874 畅通project续 最短路 floyd或dijkstra或spfa
Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择.而某些方案 ...
最新文章
- error undefined reference to __android_log_print
- CE5.0 - romimage.exe如何填充eboot.bin中的pTOC特殊指针生成.nb0
- 程序员发现 Bug 的时候是怎样一种心境?
- c语言字符串67ASDSff,(指针编程题目.doc
- Appium Python 六:管理应用和Activity
- koa2 mysql增删改查_react+koa2+mysql零门槛的全栈体验,附上完整项目分享
- 最简单的基于FFMPEG的推流器附件:收流器
- 点击编辑,进入编辑页面并把值渲染到页面上
- phpquery抓取网站内容简单介绍
- 图扑智慧交通:数字化地铁大屏管控运维平台
- 简单好用的Mac截图工具:FinalShot
- Mac本换ssd注意事项
- springboot异步调用demo
- 平实给力的写作指导入门手册——leo鉴书57
- YYLabel的几个实用小技巧
- .fla文件的链接类在.swf中的体现
- Bitbucket使用说明与SourceTree的使用
- 一个很好的机会股票的价格是向南移动
- Kingbase兼容Oracle语法--连接操作符(+)
- 计算机ppt格式化在哪里,计算机安装与维护8(分区、格式化)ppt课件.ppt
热门文章
- 千万不能返回局部变量的引用
- 1到9排序php,php通过排列组合实现1到9数字相加都等于20的方法,php排列组合_PHP教程...
- mysql 联合索引底层结构_MySQL联合索引底层数据结构
- centos wget默认路径_TRMM 数据windows平台wget下载方法(2021年1月13日可用)
- android surfaceview , videoview 背景加圆角
- 日期格式 java_Java日期格式转换
- swagger整合springMVC
- 【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价
- sublime text3 eslint 安装教程
- /etc/hosts/中HOSTNAME错误导致SETUP出错