Floyd算法

通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。
其状态转移方程如下:map[i,j]:=min{map[i,k]+map[k,j],map[i,j]}

问题描述

现已知有N(N<=10)个城市M(M<=30)条路,保证每个城市之间有路,单向到达,每个城市之间的路程不一样,求任意两个城市之间最短路程。
样例输入
4 8 (N M)
1 2 2 (城市名称 城市名称 路程)
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12

样例输出
0 2 5 4 (第一个城市到其他城市的最短路程)
9 0 3 4 (第二个城市到其他城市的最短路程)
6 8 0 1 …
5 7 10 0
题目来自 剑断青丝i

题目分析

在已知输入输出中我们可以得到图中信息:

考虑方法

由于该题是城市到城市之间的路程可能是不同的。
所以我们需要考虑一个结构,能够存储两个城市的城市名及路程。这时我们可以考虑使用二维数组。
例如:
城市1到城市2的路程表示:a[1][2] = 2
城市1到城市3的路程表示:a[1][3] = 6
城市3到城市1的路程表示:a[3][1] = 7
二维数组很轻松地帮我们解决了数据存储的问题。

初始化

一开始,我们需要将a[x][x]这类自己城市到自己城市的路程设置为0,将其他路程统一先设置为一个较大的数,方便将来程序比较的时候被替代。

求最短路径核心代码

这段代码很短,但它完成了求最短路程的工作,所以很棒。

//求最短路径核心代码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];

k是比较因子,将完成当前最短路程与其他路程的比较工作。
一开始我很疑惑,为什么k的循环要放在最外一层而不是最里面那一层?于是我列举了循环部分过程,简化后得到下图。

我发现在k=1的时候,当前城市a到城市b的最短路程与城市a经过城市1后再到达城市b的路程作对比。若当前城市a到城市b的最短路程大于城市a经过城市1后再到达城市b的路程,则城市a经过城市1后再到达城市b的路程成为了当前城市a到城市b的最短路程。
接着就是k=2,k=3、k=4的情况,最后我们通过把将所有可能经过的城市都比较了一遍,得到城市与城市之间的最短路程。

 for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)for(int k=1; k<=n; k++)if(a[i][j]>a[i][k]+a[k][j])a[i][j]=a[i][k]+a[k][j];

为了让大家更理解我讲的意思,我又画了幅讲解图。

我发现如果一开始k=e,当前城市a到城市d的最短路程为10。
但当我们知道城市d到城市c的路程为1,城市c到城市b的路程为1,城市b到城市a的路程为1后。
我们可以将k=c,得到城市d到城市b路程为2。当k=b时,得到城市d到城市a路程为3,最后城市d到城市a最短路程路程为3。
如果我们将k放在最里面那层循环的话,我们会发现有一些路程并不是最短的,因为每个城市到不同的城市只有一次更改最短路程的机会,如果后面的最短路程还不是最短,但是前面求最短路程的时候拿了不是最短路程去比较,那岂不是肯定会得到比最短路程长的路程吗?在讲解图里城市a到城市d的最短路程为只能是10, 只所以我们应当把k循环放在最外层。

最后附上代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{int i, n, j, k, a1, b1, c1, m;int inf=999999; cin>>n>>m;int a[15][15];//初始化for(int i=1; i<=n; i++)//从城市i到城市j {for(int j=1; j<=n; j++){if(i==j)a[i][j]=0;//若为同一个城市则路程为0 elsea[i][j]=inf;//若不同则置为最大路程 }}//输入已知路径for(int i=0; i<m; i++){cin>>a1>>b1>>c1;a[a1][b1]=c1;}for(int i=1; i<5; i++){for(int j=1; j<5; j++)printf("  a[%d][%d]:%7d",i, j, a[i][j]);cout<<endl;}cout<<endl;//将k作为转换因子放在最上面目的://确保把将所有可能经过的城市都比较了一遍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];//若从i到j的距离比从i到k再到j的距离大//就把原来的距离进行更新
/*  for(int i=1; i<5; i++)  //验证代码{for(int j=1; j<5; j++)printf("  a[%d][%d]:%7d",i, j, a[i][j]);cout<<endl;}*/for(int i=1; i<=n; i++){for(int j=1; j<=n; j++)cout<<a[i][j]<<" ";cout<<endl;}return 0;
}

基础算法题——城市间最短路程(Floyd算法)相关推荐

  1. 算法题-----题目、题解、个人算法、个人思考

    算法题-----题目.题解.个人算法.个人思考,项目说明]这里记录算法题目,这里记录:算法题目简单描述,暂存对于这道题的SK_cache(自己的卡点.自己的思路.自己对这道题的理解,自己的疑问.自己对 ...

  2. 任意两点间距离最短之Floyd算法

    基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离. 假设图G中顶点个数为N,则需 ...

  3. 任意两点最短路floyd算法matlab,多源最短路——Floyd算法

    Floyd算法 问题的提出:已知一个有向网(或者无向网),对每一对定点vi!=vj,要求求出vi与vj之间的最短路径和最短路径的长度. 解决该问题有以下两种方法: (1)轮流以每一个定点为源点,重复执 ...

  4. LeetCode算法题0:分发糖果【贪心算法】

    文章目录 前言 一.题目 二.思路详解 三.搞点实际点儿的(C++实现) 1.略显粗糙的代码实现 2.稍显精致的代码实现 3.最终的代码实现 4.提交结果 总结 前言 本文记录自己在LeetCode上 ...

  5. python全排序算法题_Python的100道经典算法题(1)

    按照c语言的100道经典算法题,自己原创写的,就得是自己的练习题了 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数 ...

  6. python算法题排序_python-数据结构与算法- 面试常考排序算法题-快排-冒泡-堆排-二分-选择等...

    算法可视化网站推荐---->visualgo 0.面试题中的排序算法 一些排序算法可能在工作中用的会比较少,但是面试却是不得不面对的问题.算法有助于提高我们对数据结构的理解以及提高自己的逻辑能力 ...

  7. 基础算法题——复数计算(蓝桥杯算法训练 P1103)

    复数计算题目( P1103) 编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间的加法.减法.乘法和除法分别用不用的函数来实现 ...

  8. 【算法笔记】多源最短路问题——Floyd算法

    0. 前言 在图中,如果要求任意两点间的距离,则可以使用Floyd(O(N3)\mathcal O(N^3)O(N3)

  9. python做算法题优势_Python语言在科学算法中的优势

    2019 年第 4 期 信息与电脑 China Computer & Communication 算法语言 Python 语言在科学算法中的优势 刘 瑞 (辽宁师范大学海华学院,辽宁 沈阳 1 ...

最新文章

  1. 手绘10张图,把CSRF跨域攻击、JWT跨域认证说得明明白白的
  2. Windows上打开大文件的工具
  3. 多协程实例分析(一)
  4. java wmi远程桌面服务器_WMI实现远程监控多台windows服务器
  5. 原型模式 java 深浅_Java设计模式——原型模式
  6. pc-H5 适配方案
  7. Webrtc之源码结构
  8. Linux硬件IO的优化简介
  9. java实训任务_java实训任务
  10. python 命令运行环境下 ModuleNotFoundError: No module named 'Test'
  11. 计算机 上的图片怎样加密码,高手加密法之利用图片给电脑加密新招
  12. 我绘制文章插图的三个神级工具
  13. ppt插入html,如何在PPT中嵌入网页?
  14. 手把手教你做20道菜全套教程
  15. 抖音反编译:android反编译之最新版本抖音(v7.7.0)安卓版反编译教程
  16. 日本那些最受欢迎的产品是如何设计的?
  17. 如何串联两个路由器(建议用第二种方法)
  18. HI3559V200获取IMX458摄像头数据_(1)基本逻辑
  19. SysML和UML建模工具
  20. 成人生命周期中的脑白质微结构:使用高级扩散模型和脑龄预测的纵向和横断面的混合研究

热门文章

  1. 新手坐高铁怎么找车厢_动车怎么找车厢和位置 动车的座位号是如何分布的
  2. 电脑阅卷显示准考证异常
  3. 数据结构第二版(朱昌杰版)栈和队列四(队列)
  4. p什么水管_pvc管规格-P是什么意思pvc给水管规格中T?pvc给 – 手机爱问
  5. java应用环境_搭建java应用环境.doc
  6. 很实用的Eclipse小工具——Easy Explore和Explore FS
  7. 服务器神器——tmux
  8. Apifox 接口一体化管理新神器
  9. 2021年熔化焊接与热切割报名考试及熔化焊接与热切割考试技巧
  10. Oracle oo4o vs2010 c++