Floyed(floyd)算法详解
是真懂还是假懂?
Floyed算法:是最短路径算法可以说是最慢的一个。
众所周知,dp(动态规划)要满足无后效性。也就是说。。。。。。
还是先举个例子:
我们设k取某一个k1时满足k1为最终点i到j最短路经过的点,但是在外层循环到k1时d[i][k1]和d[k1][j]并没有取到最小值,因为k1只能取一次,那么往后再循环是不是就取不到k1了呢??
答案当然不是的(不然这个算法为什么正确?)
还是那句话,dp无后效性,
也就是说,k不单单是枚举,还是一个状态变量,找i和j之间通过编号不超过k(k从1到n)的节点的最短路径(一定要注意,这里是当前最短路径,
k之前的已经变成最短路了,对于每一个k,我们都进行了n^2的充分枚举(ij),已保证当前已经满足对从1到k的节点最优,
那么当k枚举完所有点,那么一定是最优的了
换句话说,在d[i][j]=min(d[i][j],d[i][k]+d[k][j])
公式中,因为k之前已经作为i或者j被枚举过了;,d[i][k]和d[k][j] 已经被1到k枚举过了
for(k=1;k<=n;k++) //中转节点 for(i=1;i<=n;i++) 第二层循环for(j=1;j<=n;j++) 第三层循环if(e[i][j]>e[i][k]+e[k][j] )如果直接到达比通过k这个中转接点到达的距离短 e[i][j]=e[i][k]+e[k][j];那么就更新松弛
算法复杂度O(n^3),这也是为什么平常很少使用的原因。
例题校内题目:
但题目中给的点数为250,三次方为15625000,不会爆TLE,
可以使用,对于一万次询问,O(1)询问就可以过了。
但是,这个题目有一个附加条件:繁华度。
怎样在floyed算法中加入繁华度来考虑呢?
代码:(注意floyed部分)
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; int n,m,q,p[300],aj,bj,wj,x,y,f[300][300],a[300][300],top,t[300]; int cmp(int x,int y) {return p[x]<p[y]; } int main() {memset(a,63,sizeof(a));top=0;scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=n;i++)//正常输入scanf("%d",&p[i]);for(int i=1;i<=m;i++){scanf("%d%d%d",&aj,&bj,&wj);a[aj][bj]=min(a[aj][bj],wj);//初始化a[bj][aj]=min(a[bj][aj],wj);//这是邻接矩阵类型的,没用链式前向星}for(int i=1;i<=n;i++){a[i][i]=0;//对角线置为0t[i]=i;//编号}sort(t+1,t+1+n,cmp);//t数组开始时是编号,但经过sort排序后就变成了城市繁华度从小到大的顺序for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[i][j]=a[i][j]+max(p[i],p[j]);//f数组即为答案数组,这里初始化for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){a[i][j]=min(a[i][j],a[i][t[k]]+a[t[k]][j]);//a数组就是最短路数组f[i][j]=min(f[i][j],a[i][j]+max(p[i],max(p[j],p[t[k]])));f数组就是答案数组,a数组不受f数组影响,有可能a更新了,但是f将最大繁华值考虑进去后并没有更新,那么a数组保留最短路为以后的更新做铺垫}for(int i=1;i<=q;i++){scanf("%d%d",&x,&y);printf("%d\n",f[x][y]);}return 0; }
转载于:https://www.cnblogs.com/lbssxz/p/11014911.html
Floyed(floyd)算法详解相关推荐
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...
简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...
- 最短路径问题---Floyd算法详解
前言 Genius only means hard-working all one's life. Name:Willam Time:2017/3/8 1.最短路径问题介绍 问题解释: 从图中的某个顶 ...
- C++数据结构——旅游规划(Floyd算法详解)
旅游规划 作者 陈越 单位 浙江大学 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有 ...
- “chaos”的算法--之Floyd算法详解(求最短路径)
倘若我们要在计算机上建立一个交通咨询系统则可以采用图的结构来表示实际的交通网络.其实现最基本的功能,求出任意两点间的最短路径, 求最短路径的经典方法有很多种,最常用的便是迪杰斯特拉算法和佛洛依德(Fl ...
- 弗洛伊德(Floyd)算法详解
Floyd 算法是解决图论问题的比较经典的算法,用来求解赋权图中每对顶点间的最短距离.当然,在求距离的过程中也可以得到最短距离的路径.这个算法与迪杰斯特拉(Dijkstra)算法相似,他们两个都属于最 ...
- Dijkstra算法和Floyd算法详解(MATLAB代码)
一.Dijkstra算法 1.算法简介 Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式,是目前公认的最好的求解最短路径的方法.算法解决的是有 ...
- 2019matlab中的floyd,基于matlab的floyd算法详解
function [d,path]=floyd(a,sp,ep) % floyd - 最短路问题 % % Syntax: [d,path]=floyd(a,sp,ep) % % Inputs: % ...
- 排序算法(五)——堆排序算法详解及Python实现
本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...
- Dijkstra算法详解(完美图解、趣学算法)
Dijkstra算法详解 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法的基本思想 Dijkstra贪心策略 完美图解 伪代码详解 完整代码 算法解析及优化拓展 使用优先队列 ...
- Matlab人脸检测算法详解
这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...
最新文章
- 【收藏】spring boot+websocket+echarts 后台推送数据用echarts展示
- MySQL数据检索+查询+全文本搜索
- 特殊权限:SUID,SGID,Sticky
- ios 编译openssl支持arm64(转)
- Cisco Enhanced Object Tracking
- 如何成为专家-核心的七个特质
- Word2Vec 与 Word Embedding的关系
- 企业信用评分卡模型实战(python,附代码)
- YACC(BISON)使用指南
- 关于Win7 x64下过TP保护(应用层)
- 如何拥有一个游戏策划的思维
- Timeline(时间线)
- vagrant up 失败的原因之一
- java 接口 protected_为什么类和接口不能使用private和protected?接口的方法不能使用private、protected、default...
- 李飞飞:我更像物理学界的科学家,而不是工程师|深度学习崛起十年
- 初探大规模GBDT训练
- pyttsx3 语音包安装、使用详解
- 只有资源共享 中国共享软件才能突破性发展
- IllegalStateException: Failure saving state: active Fragment has cleared
- 祁隆乐凡短视频隔空宣战,和合国际收购祁隆歌曲《借我星光》版权