摘自啊哈算法-知识分享,代码自己有改动,使得输出更直观。

小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间没有,如下图。为了节省经费以及方便计划旅程,小哼希望出发之前知道任意两个城市之间的最短路程。

上图中有四个城市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算法的更多相关文章

  1. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  2. 单源最短路径(dijkstra算法)php实现

    做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...

  3. 单源最短路径——Floyd算法

    正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3). Floyd算法的基本思想如下:从任意 ...

  4. 多源最短路径Floyd算法

    多源最短路径是求图中任意两点间的最短路,采用动态规划算法,也称为Floyd算法.将顶点编号为0,1,2...n-1首先定义dis[i][j][k]为顶点 i 到 j 的最短路径,且这条路径只经过最大编 ...

  5. 0016:单源最短路径(dijkstra算法)

    题目链接:https://www.luogu.com.cn/problem/P4779 题目描述:给定一个 n 个点,m 条有向边的带非负权图,计算从 s 出发,到每个点的距离. 这道题就是一个单源最 ...

  6. 【算法导论】单源最短路径之Dijkstra算法

    Dijkstra算法解决了有向图上带正权值的单源最短路径问题,其运行时间要比Bellman-Ford算法低,但适用范围比Bellman-Ford算法窄. 迪杰斯特拉提出的按路径长度递增次序来产生源点到 ...

  7. 【算法导论】单源最短路径之Bellman-Ford算法

    单源最短路径指的是从一个顶点到其它顶点的具有最小权值的路径.我们之前提到的广度优先搜索算法就是一种无权图上执行的最短路径算法,即在所有的边都具有单位权值的图的一种算法.单源最短路径算法可以解决图中任意 ...

  8. 单源最短路径:Dijkstra算法(堆优化)

    前言:趁着对Dijkstra还有点印象,赶快写一篇笔记. 注意:本文章面向已有Dijkstra算法基础的童鞋. 简介 单源最短路径,在我的理解里就是求从一个源点(起点)到其它点的最短路径的长度. 当然 ...

  9. 全源最短路径 - floyd算法 - O(N ^ 3)

    Floyd-Warshall算法的原理是动态规划. 设Di,j,k为从i到j的只以(1..k)集合中的节点为中间节点的最短路径的长度. 若最短路径经过点k,则Di,j,k = Di,k,k − 1 + ...

  10. 单源最短路径的Bellman-Ford 算法

    1.算法标签 BFS 2.算法概念 Bellman-Ford算法有这么一个先验知识在里面,那就是最短路径至多在N步之内,其中N为节点数,否则说明图中有负权值的回路,这样的图是找不到最短路径的.因此Be ...

随机推荐

  1. MAC中使用Vim和GCC编译C程序

    1.打开终端 2.输入以下命令进入vim编辑器: vim a.c 3.进入编辑器后按i进入insert模式,然后键入以下代码: #include<stdio.h> int main(){ ...

  2. matlab计算矩阵每列非0元素个数

    在统计分析中,有时候需要计算矩阵每列非0元素的个数,可以用以下方法: 先用find找到每列不为0的元素index,然后用count计数. 假设有矩阵A[M,N], 结果存在countZeros cou ...

  3. C# is 运算符

    is 运算符并不是说明对象是某种类型的一种方式,而是可以检查对象是否是给定的类型,或者是否可以转换为给定的类型,如果是,这个运算符就返回true.is 运算符的语法如下: <operand> ...

  4. Oracle 表空间迁移

    迁移表空间databump 使用databump导入导出,两个库用户必须一致,否则另一个库导入的时候会报错.所以两个库都是用helei用户. 给两个数据库的用户分别授予dba权限,这里只是实验更清晰而 ...

  5. C# INotifyPropertyChanged使用方法

    INotifyPropertyChanged 接口:向客户端发出某一属性值已更改的通知. NotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通 ...

  6. 关于Visual Studio未能加载各种Package包的解决

    参考微软社区的一个答复解决了VS2013的问题: 进入VS对应的用户缓存文件夹,删掉那个Microsoft.VisualStudio.Default.cache缓存文件,就可以了. 这个错误估计是我们 ...

  7. 微信小程序开发系列(二)小程序的全局文件

    其实你已经知道了小程序的文件结构 上一节讲到,小程序的页面由三部分组成: 视图(.wxml).逻辑(.js).样式(.wxss). 我们这次重新展开文件结构: 小程序用到的文件类型只有四种,正如你所看 ...

  8. java cooki的使用

    session: 当新客户端发现一个HTTP请求时服务端会创建一个session.并分配一个sessionID作为服务端来客户端的识别,session对象会 保存在服务端.此时session对象处天N ...

  9. 一个web应用的诞生--使用模板

    经过了第一章的内容,已经可以做出一些简单的页面,首先用这种方式做一个登录页面,首先要创建一个login的路由方法: @app.route("/login",methods=[&qu ...

  10. ubuntu linux 下 mysql 学习笔记

    '#' 后为注释 以下为在shell中的操作: 打开终端(terminal)1.登录MySQL mysql-u root -p 输入密码:******2.几个简单的命令 (1)show databas ...