最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括:

确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。

确定终点的最短路径问题 - 与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。

确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。

全局最短路径问题 - 求图中所有的最短路径。

最短路径的几大常用的经典算法有:floyd算法、Dijkstra、spfa算法等。其中,floyd是最易于理解的算法,当然,其时间复杂度也是蛮尴尬的O(n^3)

首先说明一下:Floyd算法又称为插点法,对于每一对顶点i和j,看看是否存在一个顶点k使得从 i到k再到 j比已知的路径更短。如果是更新它。
把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=无穷大。定义一个矩阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。

比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。

所以说,其方法就是枚举暴力,我们可以傻瓜式的写出三个for循环就可以搞定了

//存在一个k 使aik+akj路径小于aij 
for(k=0;k<C_nPointId;k++)
for(i=0;i<C_nPointId;i++)
for(j=0;j<C_nPointId;j++)
V_nMapValue[i][j]=fmin(V_nMapValue[i][j],V_nMapValue[i][k]+V_nMapValue[k][j]);

看一道例题

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2112

题目描述:

经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
Input
输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000);
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
Output
如果徐总能到达目的地,输出最短的时间;否则,输出“-1”。
Sample Input
6
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1
Sample Output
50
Hint:
The best route is:
xiasha->ShoppingCenterofHangZhou->supermarket->westlake

解题思路:首先,先把每个name转换成一个对应的id(由于比较懒,映射方法就直接写了一层循环遍历了= =!)

然后运用floyd枚举所有的点。

#include<stdio.h>
#include<string.h>
#define INF 999999999
int V_nMapValue[155][155];
int  C_nPointId;
char N_sPointName[155][40];int fmin(int a,int b)
{return a<b?a:b;
}void Init()
{int i,j;for(i=0;i<155;i++)for(j=0;j<155;j++)V_nMapValue[i][j]=(i==j)?0:INF;
}int Get_PointId_by_PointName(char *s)
{int i;for(i=0;i<C_nPointId;i++)if(!strcmp(N_sPointName[i], s))return i;strcpy(N_sPointName[C_nPointId],s);C_nPointId++;return C_nPointId-1;
}void Floyd()
{int i,j,k;//存在一个k 使aik+akj路径小于aij for(k=0;k<C_nPointId;k++)for(i=0;i<C_nPointId;i++)for(j=0;j<C_nPointId;j++)V_nMapValue[i][j]=fmin(V_nMapValue[i][j],V_nMapValue[i][k]+V_nMapValue[k][j]);
}int main()
{int n,i,j;while(~scanf("%d",&n)&&n!=-1){Init();                  char N_sStPoint[40], N_sEnPoint[40];scanf("%s%s",&N_sStPoint, &N_sEnPoint);strcpy(N_sPointName[0], N_sStPoint);strcpy(N_sPointName[1], N_sEnPoint);C_nPointId = 2;char Point_a_name[40],Point_b_name[40];int  Point_a_id,Point_b_id,Value_By_ab;for(i=0;i<n;i++){scanf("%s%s%d",&Point_a_name,&Point_b_name,&Value_By_ab);Point_a_id = Get_PointId_by_PointName(Point_a_name);Point_b_id = Get_PointId_by_PointName(Point_b_name);V_nMapValue[Point_a_id][Point_b_id] = V_nMapValue[Point_b_id][Point_a_id] = Value_By_ab;}if(!strcmp(N_sStPoint, N_sEnPoint)){printf("0\n");continue;}/*for(i=0;i<C_nPointId;i++)for(j=0;j<C_nPointId;j++)printf("%d%c",V_nMapValue[i][j],j==C_nPointId-1?'\n':' ');*/Floyd();if(V_nMapValue[0][1]==INF)printf("-1\n");elseprintf("%d\n",V_nMapValue[0][1]);}return 0;
}

最短路径——Floyd算法HDU Today(hdu2112)相关推荐

  1. C++ 实现带权有向图的每对顶点之间的最短路径Floyd算法(完整代码)

    基本思想是: 假设求从顶点vi到vj的最短路径. 如果从vi到vj有弧,则从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,尚需进行n次试探. 首先考虑路径(vi, v0, ...

  2. 最短路径——Dijkstra算法HDU Today(hdu2112)

    关于本题的floyd解法:http://blog.csdn.net/sm9sun/article/details/53282826 上篇博文介绍了floyd解决最短路径的方法,然而由于floyd极大的 ...

  3. 最短路径(Floyd算法)(c/c++)

    如果要得到图中各个顶点之间的最短路径,方法1:可以对每一个顶点采用Dijkstra算法:方法2:可以采用Floyd算法,它是一种用来求双源点之间最短路径的算法,采用邻接矩阵来存储图 辅助结构 int ...

  4. 最短路径--Floyd算法

    Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被 ...

  5. 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...

    简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...

  6. 最短路径——Floyd算法及优化(蓝桥杯试题集)

    *对最短路径问题以及floyd算法.Dijkstra算法不是很理解的同学请移步前几篇博客~ 题目链接: http://lx.lanqiao.cn/problem.page?gpid=T15 问题描述 ...

  7. HDU2066 一个人的旅行【最短路径+Floyd算法】

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  8. 求最短路径Floyd算法的并行化(解APSP问题)

    求最短路径的串行算法在互联网上应该一搜一大堆,也非常简单,几行代码搞定.但Floyd的并行算法却很难搜到,github倒是有一些,但不容易运行成功,这里对这个算法的并行化进行详细的讲解,结合论文以及实 ...

  9. 多源最短路径--Floyd算法

    #include<iostream> #include<cstdio> using namespace std; const int INF = 0x3f3f3f3f; int ...

最新文章

  1. Google Chrome 72 丢弃HPKP,不再支持TLS1.0和TLS1.1!
  2. 华为鸿蒙系统源码_鸿蒙系统 IO 栈分析 | 解读鸿蒙源码
  3. AI公开课:19.04.18俞益洲—深睿医疗CS《计算机视觉的应用与落地》课堂笔记以及个人感悟
  4. Give root password for maintenance 问题解决.
  5. android 多手指触摸屏,AIR Android:关于多点触摸
  6. groovy 2.5.4_Java 7 vs Groovy 2.1性能比较
  7. 程序员!别逼自己买课了,每天花10分钟做这件事,写代码能力暴增......
  8. 3 5的二维数组C语言程序,C语言及程序设计提高例程-33 二维数组元素的引用
  9. notepad多行编辑_Windows 10 UWP 推荐 | 极具现代感的轻量化文本编辑器:Notepads
  10. android support v7 v13,Android support V3 v7 v13的区别
  11. Linux脚本验证的常见方法,linux shell常用循环与判断语句(for,while,until,if)使用方法...
  12. Spring中的Bean配置
  13. 详解ifconfig命令
  14. Map的使用和遍历方法示例
  15. 使用QGIS将文本坐标转换为矢量文件
  16. Windows下的MySQL安装、MySQL-Front安装
  17. 二阶系统阶跃响应实验_二阶系统阶跃响应实验心得体会
  18. 软考软件设计师中级考试(二)——操作系统基本原理
  19. 没了疫情红利的华大基因,靠什么保持增长?
  20. Android 视频裁剪 (含裁剪 View)

热门文章

  1. 12 PP配置-生产主数据-工艺路线相关-定义物料类型分配
  2. php遍历子分类的函数,emlog程序获取主分类下的所有子分类ID函数
  3. php mongodb 视频教程,燕十八mongodb视频资料分享
  4. android 调出键盘表情_如何在Android的G板键盘中搜索表情符号和GIF | MOS86
  5. pmos导通条件 图示_如何判断NMOS管和PMOS管
  6. canvas绘制竖排的数字_Python绘制可爱的卡通人物 | 【turtle使用】
  7. 未能连接到许可证服务器 发生错误 -96,ug启动许可证错误怎么办 UG软件启动许可证错误96解决方法...
  8. 从双层优化视角理解对抗网络GAN
  9. 中文select 加载完成后再排序
  10. link标签引入.css文件(目的):适配不同屏幕