多源最短路径---Floyd-Warshall算法
摘自啊哈算法-知识分享,代码自己有改动,使得输出更直观。
小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间没有,如下图。为了节省经费以及方便计划旅程,小哼希望出发之前知道任意两个城市之间的最短路程。
上图中有四个城市8条公路,公路上的数字表示该公路的长短。现在需要求任意两个城市之间的最短路径,也就是求任意两点之间的最短路径。“多源路径最短”问题。
现在需要一个数据结构来存储图的信息,用一个4*4的矩阵来存储。比如城市1到城市2的路程为2,则设e[1][2]的值为2。2号城市无法到达城市4,则设置e[2][4]的值为无穷。另外此处约定一个城市自己到自己的路程为0。
问题:如何求任意两点之间的最短路径?
通过之前的学习,深度优先搜索或者广度优先搜索可以求出两点之间的最短路径。所以进行n平方遍深度或者广度优先搜索,即对每两个点都进行一次深度或者广度优先搜索,便可以求出任意两点的最短路径。but,代码可读性差。
这里,采用Floyd-Warshall算法,只有五行代码的算法进行计算。
基本思想:最开始只允许经过1号顶点进行中转,接下来只允许经过1号和2号顶点进行中转.......允许经过1~n号顶点进行中转,求任意两点之间的最短路径。
用一句话概括:从i号顶点到j号顶点只经过前k号顶点的最短路程。其实这是一种“动态规划”的思想。
Floyd-Warshall算法核心代码是:
for (k = 1; k <= n; k++) //k代表i到j间的任一点
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (e[i][k]<inf && e[k][j]<inf && e[i][j]>e[i][k] + e[k][j])
e[i][j] = e[i][k] + e[k][j];
下面给出这个算法的完整代码及其输出结果:
完整代码:
/*Floyd-Warshall算法 佛洛依德-沃舍尔*/
#include<stdio.h> int main()
{
int i, j, k, n, m;
int e[][];
int t1, t2, t3;
int inf = ; //如果有100条边,则正无穷只需用10001表示,就比10000多1即可。
//读入n和m,n表示顶点个数,m表示边的个数
scanf_s("%d %d", &n, &m);
//初始化
for (i = ; i <= n; i++)
for (j = ; j <= n; j++)
if (i == j)
e[i][j] = ;
else
e[i][j] = inf;
//读入边
for (i = ; i <= m; i++)
{
scanf_s("%d %d %d", &t1, &t2, &t3);
e[t1][t2] = t3;
}
//输出开始数据矩阵
printf("初始的路径矩阵:\n");
printf(" ");
for (i = ; i <= n; i++)
printf("%10d", i);
printf("\n");
for (i = ; i <= n; i++)
{
printf("%d", i);
for (j = ; j <= n; j++)
{
printf("%10d", e[i][j]);
}
printf("\n");
}
//Floyd-Warshall算法核心语句
for (k = ; k <= n; k++) //k代表i到j间的任一点
for (i = ; i <= n; i++)
for (j = ; j <= n; j++)
{
//如果正无穷与另一个值相加大于正无穷不被允许,
//则需要多加上前两个条件
if (e[i][k]<inf && e[k][j]<inf && e[i][j]>e[i][k] + e[k][j])
e[i][j] = e[i][k] + e[k][j];
}
//输出最终结果
printf("Floyd-Warshall的最短路径矩阵:\n");
printf(" ");
for (i = ; i <= n; i++)
printf("%10d", i);
printf("\n");
for (i = ; i <= n; i++)
{
printf("%d", i);
for (j = ; j <= n; j++)
{
printf("%10d", e[i][j]);
}
printf("\n");
}
return ;
}
输出结果:
注意:此处无穷用99999999代替。
多源最短路径---Floyd-Warshall算法的更多相关文章
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- 单源最短路径(dijkstra算法)php实现
做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...
- 单源最短路径——Floyd算法
正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3). Floyd算法的基本思想如下:从任意 ...
- 多源最短路径Floyd算法
多源最短路径是求图中任意两点间的最短路,采用动态规划算法,也称为Floyd算法.将顶点编号为0,1,2...n-1首先定义dis[i][j][k]为顶点 i 到 j 的最短路径,且这条路径只经过最大编 ...
- 0016:单源最短路径(dijkstra算法)
题目链接:https://www.luogu.com.cn/problem/P4779 题目描述:给定一个 n 个点,m 条有向边的带非负权图,计算从 s 出发,到每个点的距离. 这道题就是一个单源最 ...
- 【算法导论】单源最短路径之Dijkstra算法
Dijkstra算法解决了有向图上带正权值的单源最短路径问题,其运行时间要比Bellman-Ford算法低,但适用范围比Bellman-Ford算法窄. 迪杰斯特拉提出的按路径长度递增次序来产生源点到 ...
- 【算法导论】单源最短路径之Bellman-Ford算法
单源最短路径指的是从一个顶点到其它顶点的具有最小权值的路径.我们之前提到的广度优先搜索算法就是一种无权图上执行的最短路径算法,即在所有的边都具有单位权值的图的一种算法.单源最短路径算法可以解决图中任意 ...
- 单源最短路径:Dijkstra算法(堆优化)
前言:趁着对Dijkstra还有点印象,赶快写一篇笔记. 注意:本文章面向已有Dijkstra算法基础的童鞋. 简介 单源最短路径,在我的理解里就是求从一个源点(起点)到其它点的最短路径的长度. 当然 ...
- 全源最短路径 - floyd算法 - O(N ^ 3)
Floyd-Warshall算法的原理是动态规划. 设Di,j,k为从i到j的只以(1..k)集合中的节点为中间节点的最短路径的长度. 若最短路径经过点k,则Di,j,k = Di,k,k − 1 + ...
- 单源最短路径的Bellman-Ford 算法
1.算法标签 BFS 2.算法概念 Bellman-Ford算法有这么一个先验知识在里面,那就是最短路径至多在N步之内,其中N为节点数,否则说明图中有负权值的回路,这样的图是找不到最短路径的.因此Be ...
随机推荐
- cocos2d-x 定时器selector的使用 :schedule的使用
在游戏设计时,我们需要不断的改变屏幕显示来反映游戏操作的效果,最简单的就是提示用户已经进行的游戏时间.为此,我们需要使用cocos2d-x内置的任务调度机制,即CCNode的schedule成员函数. ...
- Android与JNI(一) ---- Java调用C 静态调用
第一.通过eclipse新建一个工程名为HelloJni的android工程,并编译. 第二.右键工程-->Android Tools --> Add Native Support,出现如 ...
- lower_bound和upper_bound算法实现
lower_bound算法要求在已经按照非递减顺序排序的数组中找到第一个大于等于给定值key的那个数,其基本实现原理是二分查找,如下所示: int lower_bound(vector<int& ...
- 使用python爬取MedSci上的期刊信息
使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...
- centos 6.5中安装hadoop2.2
1.配置集群机器之间ssh免密码登录 (1) ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 将id_dsa.pub 公钥 加入授权的key中去 这条命令的功能是把公 ...
- 用js给html控件赋值
用js给html控件赋值 <script> window.onload=function setValue()//在页面加载时赋值 { document.getElementById( ...
- chrome的功能Copy as cURL
https://segmentfault.com/q/1010000002508961
- SNPs & MAF
SNPs,全称是single nucleotide polymorphisms,SNPs等位基因频率的容易估计.采用混和样本估算等位基因的频率是种高效快速的策略.该策略的原理是:首先选择参考样本制作标 ...
- 2.4. 属性(Core Data 应用程序实践指南)
属性的名称必须以小写字母开头. 添加 name 和 quantity 属性.
- bootstrap的alert提示框的关闭后再显示问题
bootstrap中有alert组件,如果点击关闭按钮后该组件会被删除而不是被隐藏,想再显示怎么办呢? bootstrap-alert.js源码片段: function removeElement() ...