最短路

1.多源最短路

定义:现有n个地点,求任意两点间的最短距离

算法:弗洛伊德(floyd)算法

思想:让每一个点成为中转点,进行"松弛"操作;

所谓松弛操作就是要搞出 A+B<C 的效果,举个栗子

咱们从软院到计算机学院要走6个单位,但是我们让文学院作为中转点的话,就有了2+3=5<6的效果,这就是进行了松弛操作。我们尝试以不同的点进行松弛操作,保留最近的那种。

那么我们要实现弗洛伊德算法的存储的话,一般都是用邻接矩阵实际上就是二维数组来实现的。

以上图为例子>我们把它转换成表格,两路不通的视为无穷大,输入样例是用 999 代替,表格如下:

代码实现:

#include <iostream>
#include <algorithm>using namespace std;int a[10][10];
int main()
{int n;cin >> n;for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){cin >> a[i][j];}}for(int k = 1; k <= n; k++) //k是我们尝试的各个中转点{for(int i = 1; i <= n; i++)  //i为起点,j为终点;起点终点也都要遍历一遍{for(int j = 1; j <= n; j++)if(a[i][j] > a[i][k] + a[k][j])  //松弛操作,比较距离,更短就更新{a[i][j] = a[i][k] + a[k][j];}}}for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){cout << a[i][j] << ' ';}cout << endl;}return 0;
}

输入输出:

例题

洛谷P2910:Clear And Present Danger S
代码:

#include <bits/stdc++.h>
using namespace std;int a[105][105], n;
int m;
int b[10005];int main()
{
//输入cin >> n >> m; //n个岛屿for(int i = 1; i <= m; i++)cin >> b[i];for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){cin >> a[i][j];}}for(int k = 1; k <= n; k++)for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)if(a[i][j] > a[i][k] + a[k][j])a[i][j] = a[i][k] + a[k][j];int ans = 0;for(int i = 1; i <= m - 1; i++)ans += a[b[i]][b[i + 1]];cout << ans;return 0;
}

2.单源最短路

定义:某一个地点到任意一个地点的最短距离

算法:迪杰斯特拉(dijkstral)算法

例子:求软院到其他学院的最短距离

思想:把所有点分为两个阵营,一个为已求出最短距离阵营,另一个为未求出最短距离阵营。把每一个未求出最短距离阵营的点依次加入到求出最短距离阵营(每次找的是离求出最短距离阵营最近的点),并用这个点作为中转点,进行松弛操作。

和弗洛伊德算法不同,狄克斯特拉算法需要我们再创建一个一维数组来存储指定点到其他点的最短距离;如图:

根据上述思想,软院因为是自己到自己所以就不需要考虑了,接着找离最短距离阵营最近的点也就是文学院,把它加入最短距离阵营,让文学院成为中转点去松弛其他未加入最短距离阵营的点,发现到计算机学院结果为5<6,所以将6更新为5,而到公教楼则是>4的就不会松弛成功;接着找距离文学院最近的点即公教楼,让公交楼加入最短距离阵营,再以公教楼为中转点去松弛剩下的计算机学院,结果>5松弛失败;最后只剩计算机学院,我们将他加入最短距离阵营。
更新完成后的表格数据为:0 2 5 4

代码实现

int dis[505]; ///最短距离
int n, m;
int book[505]; ///0表示未加入最短距离阵营,1表示最短距离阵营
const int inf = 0x3f3f3f3f; ///无穷大
void dijkstra()
{book[1] = 1; ///自己到自己不用求for(int i = 1; i <= n - 1; i++){int minn = inf;int u;//找距离最短距离阵营最近的点ufor(int j = 1; j <= n; j++){if(book[j] == 0 && dis[j] < minn){minn = dis[j];u = j;}}book[u] = 1;for(int j = 1; j <= n; j++){if(book[j] == 0 && dis[j] > dis[u] + a[u][j]){dis[j] = dis[u] + a[u][j];}}}
}

例题

ACwing849最短路

代码:

#include <bits/stdc++.h>
using namespace std;int a[505][505];
int dis[505]; //最短距离
int n, m;
int book[505]; //0表示未加入最短距离阵营,1表示最短距离阵营
const int inf = 0x3f3f3f3f; //无穷大
void dijkstra()
{book[1] = 1; //自己到自己不用求for(int i = 1; i <= n - 1; i++){int minn = inf;int u;//找距离红色阵营最近的点ufor(int j = 1; j <= n; j++){if(book[j] == 0 && dis[j] < minn){minn = dis[j];u = j;}               }book[u] = 1;for(int j = 1; j <= n; j++){if(book[j] == 0 && dis[j] > dis[u] + a[u][j]){dis[j] = dis[u] + a[u][j];}}}
}int main()
{
cin >> n >> m; //n个点,m条边
//初始化for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){if(i == j)a[i][j] = 0;elsea[i][j] = inf;}}
//输入边for(int i = 1; i <= m; i++){int x, y, z;cin >> x >> y >> z;if(z < a[x][y])a[x][y] = z;}for(int i = 1; i <= n; i++)dis[i] = a[1][i];dijkstra();if(dis[n] < inf)cout << dis[n];elsecout << -1;return 0;}

最短路-弗洛伊德算法狄克斯特拉算法相关推荐

  1. 算法 | 狄克斯特拉算法

    算法 | 狄克斯特拉算法 1. 简介 简介: 摘自百度百科 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路 ...

  2. 菜鸟学算法-狄克斯特拉算法

    什么是狄克斯特拉算法 狄克斯特拉算法用于解决有图的最短路径寻找,类似于深度优先算法,每次只走最短距离,走过的不在走,继续寻找最短距离,并不断更新到节点的开销-即是权重,保证开销最小才更新,最后所有节点 ...

  3. 算法-狄克斯特拉算法

    狄克斯特拉算法简介 狄克斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题,但不能用于包含负权边的图.而广度优先搜索算法解决的是无权图中的最短路径问题. 一般分为4个步骤: ...

  4. 算法之狄克斯特拉算法 --《图解算法》

    2019你好!好好生活,好好工作! 狄克斯特拉算法 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: ...

  5. 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  6. 算法图解 第7章 狄克斯特拉算法

    本章内容 继续图的讨论,介绍加权图------提高或降低某些边的权重. 介绍狄克斯特拉算法,让你能够找出加权图中前往X的最短路径. 介绍图中的环,它导致狄克斯特拉算法不管用. 在前一章,你找出了从A点 ...

  7. 初学狄克斯特拉算法~(待提高)

    读书笔记 狄克斯特拉算用来寻找加权图的"最短路径"(不一定是段数最少,我们需要一定的量度,比如说最少花费,最短时间等,bfs只是解决了段数的最短路径问题) 鉴于无向图就是一个环,而 ...

  8. 最短路径--Dijkstra(狄克斯特拉)算法

    最短路径 路径的概念:       在一个无权的图中,若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减 1 .        由于从一顶点到另一顶 ...

  9. 狄克斯特拉算法(入门)

    狄克斯特拉算法可以找出加权图中前往X的最短路径. 注意: - 其只适用于有向无环图 - 适用于正权边,负权边的将出错(贝尔曼-福德算法适用于负权边) 步骤: 找出当前最"便宜"的节 ...

最新文章

  1. linux下搭建mrbs会议室预定管理系统
  2. 【实习】今日头条【抖音火山】后台开发实习生
  3. 重置密码遇到ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using passwor:yes)问题
  4. 前端基础知识整理汇总(上)
  5. kong组件_Kong插件开发工具包
  6. font HTML语言,HTML font 标签
  7. 编译php的时候,报configure: error: mcrypt.h not found. Please reinstall libmcrypt.错误的解决办法...
  8. python批量检索文献_自从用了Python,轻松查文献,释放80%的重复劳动时间!
  9. Redis中的主从复制原理
  10. 安装VSCode作为常用的文本编辑器
  11. 深度学习(七十三)pytorch学习笔记
  12. 数据库笔记09:Transact-SQL语言编程基础
  13. PAT甲级1010 (进制和二分法)
  14. U盘的文件夹变成快捷方式,原来是这个病毒在作祟hypertrm.exe
  15. java 获取星期几_java中获取日期是星期几的两种方法
  16. 洛谷:P6560 [SBCOI2020] 时光的流逝(博弈、拓扑序列)
  17. 四旋翼飞行器控制pid学习笔记
  18. Photoshop插件-charIDToTypeID-PIStringTerminology.h-不同值的解释及参考-脚本开发-PS插件
  19. 计算机中丢失safeengine.dll,safeengine.dll
  20. A Survey on Malicious Domains Detection through DNS Data Analysis

热门文章

  1. 大白菜制作U盘启动盘且保存4G以上的镜像教程
  2. 两大消息突袭!中国楼市未来15年的命运要定了!
  3. 时间片轮转计算例题截图
  4. 浙大计算机复试被刷再战,浙大复试刷掉笔试“第一”,录取了倒数第一,这就是考研的公平?...
  5. R 语言中的 Kolmogorov-Smirnov 检验
  6. 分组交换(存储-转发)
  7. iPhoto的删除动画
  8. HM-RocketMQ1【课程大纲、MQ介绍】
  9. 什么是跨域?什么情况下会发生跨域请求?
  10. jupyter notebook 配置