Floyd算法(最短路)
如题,这是最短路算法Floyd。
Floyd,是只有五行的代码。
简单,易懂。O(N的三方)的时间也可以。
遇到简单的就这么用。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<queue>
#define s(q) scanf("%d",&q)
#define p(q) printf("%d",q)
#define pk(q) printf(" %d",q)
#define pp printf("\n")
#define lp(q) printf("%lld",q)
#define r(q) return q;
#define ffor(i,l,k) for(i=l;i<=k;i++)
using namespace std;
int n,i,j,k;
int a[][];
void Floyd(){
ffor(i,,n)
ffor(j,,n)
ffor(k,,n)
if(a[i][j]>a[k][j]+a[i][k] && a[k][j]+a[i][k]>)
a[i][j]=a[k][j]+a[i][k];
}
int main(){
s(n);
ffor(i,,n)
ffor(j,,n)
s(a[i][j]);
Floyd();
/*ffor(i,1,n){
ffor(j,1,n){
pk(a[i][j]);
}pp;
}*/
r();
}
这一条是不是很简单?
Floyd的作用就是帮你寻找两个点的最短路,就是:
如果i点到j点的路线大于i点到k点,然后再转到j点的路线,那么你就可以将i点到j点的路线替换为i点到k点,然后再转到j点的路线。
如果说两条边不能通,设为正无穷也可以。
我的输入可以改成:
现将所有的点与点的边变为正无穷,然后在输入某一点到另一点的,更新数据,再Floyd。
注意:要找到不能找为止!
值得一提的是,Floyd并不能“负权回路”,因为这种东西没有最短路。
就像这样:1->2->3->1->2......1->2->3......每一次循环最短路就会减少1,永远找不到。
如果要快,可以用Dijkstra算法(空间复杂度O(M),时间复杂度O(M+N)logN)以及Bellman-Ford及其优化(空间复杂度O(M),时间复杂度O(NM)或最坏O(NM))
额,Floyd空间复杂度是O(N的2方),时间复杂度是O(N的3方)。
如果你看不清楚上面的Floyd就看下面这个没有#define的。
void Floyd(){
for(i=;i<=n;i++)
for(j=;j<=n;j++)
for(k=;k<=n;k++)
if(a[i][j]>a[k][j]+a[i][k] && a[k][j]+a[i][k]>)
a[i][j]=a[k][j]+a[i][k];
}
应该没有人不知道a[i][j]干什么吧?
a是用来贮存最短路的。
Floyd算法(最短路)的更多相关文章
- JZYZOJ1457 [NOIP2016]换教室 期望dp 动态规划 floyd算法 最短路
http://172.20.6.3/Problem_Show.asp?id=1457 我不知道为什么我倒着推期望只有80分,所以我妥协了,我对着题解写了个正的,我有罪. #include<cst ...
- 最短路--floyd算法模板
floyd算法是求所有点之间的最短路的,复杂度O(n3)代码简单是最大特色 #include<stdio.h> #include<string.h> ; const int I ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
- 多源最短路Floyd 算法————matlab实现
弗洛伊德(Floyd)算法是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想 通过Floyd计 ...
- 最短路 - floyd算法
floyd算法是多源最短路算法 也就是说,floyd可以一次跑出所以点两两之间的最短路 floyd类似动态规划 如下图: 用橙色表示边权,蓝色表示最短路 求最短路的流程是这样的: 先把点1到其他点的最 ...
- HDU 2066 最短路floyd算法+优化
http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是 ...
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 【POJ - 2139】Six Degrees of Cowvin Bacon (Floyd算法求最短路)
Six Degrees of Cowvin Bacon Descriptions 数学课上,WNJXYK忽然发现人缘也是可以被量化的,我们用一个人到其他所有人的平均距离来量化计算. 在这里定义人与人的 ...
- 【POJ - 3259】Wormholes(最短路 Floyd算法)
Wormholes 题目描述 教学楼里有很多教室,这些教室由双向走廊连接.另外,还存在一些单向的秘密通道,通过它们可以回到过去.现在有 N (1 ≤ N ≤ 500) 个教室,编号 1..N, M ( ...
- 【Aizu - 0189】Convenient Location (最短路 Floyd算法)
Convenient Location 直接翻译了 Descriptions 明年毕业的A为就业而搬家.就职的公司在若干城市都有办公室,不同天出勤的办公室也不同.所以A在考虑住在哪去各个办公室的时长最 ...
随机推荐
- KVM套件-linux基础
KVM套件 使用KVM的虚拟机,通过KVM的虚拟机克隆功能,提高效率,避免在实验过程中重装系统. 另外,在LINUX系统上使用KVM的虚拟化,可以获得更好性能,且可以提前熟悉企业级虚拟化技术. 过程: ...
- 转每天一个linux命令(3):pwd命令
Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文 ...
- 打造基于Clang LibTooling的iOS自动打点系统CLAS(三)
1. 源码变换 第一章我们提到过,CLAS的本质是对源码做一次非常简单的变换(有些文章里称作变形),即Source-Source-Transformation,将打点代码精确地插入到目标函数的首部,保 ...
- C++类静态成员与类静态成员函数
当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象 ...
- ES6的语法
一,定义变量let(类似var) 在js一直有一个bug是var: 1.var 声明的变量会有变量提升 console.log(name); //jhon var name = 'jhon'; 2.v ...
- Swift4.0 Array详解
数组的介绍 数组(Array)是一串有序的由相同类型元素构成的集合,数组中的集合元素是有序的,可以重复出现.在Swift中数组类型是Array,是一个泛型集合.数组分成:可变数组和不可变数组,分别使用 ...
- [译] 反思 1 号进程 / Rethinking PID 1
By Lennart Poettering 译 SReadFox 原文链接:http://0pointer.de/blog/projects/systemd.html 译注:笔者大约在 2011 年读 ...
- oracle12c之 单机12.1.0.1打补丁
1. 下载最新的12.1.0.1的DB PSU 与 OPatchp23054354_121010_Linux-x86-64.zipp6880880_121010_Linux-x86-64.zip 2. ...
- poj 3013 SPFA
首先看题看的很懵.. 然后这题直接没想用Djstra做 TLE了.看discuss,Dijstra要用堆优化,也可以用SPFA做. 这里在网上找了这两种做法的区别,点多稠密图用Dij,以为它是操作点的 ...
- 最近一直在做java爬虫,有些感悟心得,分享给大家;
首先,看完这篇文章,不能保证你成为大神,但是却可以让你懂得什么是爬虫,如何使用爬虫,如何利用http协议,侵入别人的系统,当然只是一些简单的教程,拿到一些简单的数据: 先上代码,在一步一步讲解: 这是 ...