首先 先介绍一下 FLOYD算法的基本思想
设d[i,j,k]是
在只允许经过结点1…k的情况下
i到j的最短路长度
则它有两种情况(想一想,为什么):
最短路经过点k,d[i,j,k]=d[i,k,k-1]+d[k,j,k-1]
最短路不经过点k,d[i,j,k]=d[i,j,k-1]
综合起来: d[i,j,k]=min{d[i,k,k-1]+d[k,j,k-1],d[i,j,k-1]}
边界条件: d[i,j,0]=w(i,j)(不存在的边权为∞)
floyd算法的流程:
把k放外层循环,可以节省内存
对于每个k,计算每两点的目前最短路
代码(需记忆)
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if (d[i,k]<∞)and(d[k,j]<∞)
and(d[i,k]+d[k,j]<d[i,j]) then
d[i,j]:=d[i,k]+d[k,j] (以上2段引自刘汝佳的课件)
时间复杂度:O(n^3)
FLOYD算法的复杂度虽然是O(n^3)但是它计算出任意一对点之间的最短路。
FLOYD的代码具有一种简洁美,当时间不允许写其他算法时的时候,写一个FLOYD,骗一部分的分,也是一个不错的选择。
另一方面,它不怕负权边,也可以判断负权回路。
接下来通过几个例题让我们看看FLOYD 算法的神奇威力。
第一. 求最小环
有向图的最小环和无向图的最小环完全是两种不一样的问题。
其一般解法都是枚举一条边uv删除,然后求一条uv间的最短路径(假设长S)然后用S+边uv的长,来更新答案。
如果用SPFA来求最短路,那么复杂度是O(m*km) k的取值取决于 图本身。
但是FLOYD算法可以在O(n^3)内很轻松地解决这个问题。
首先对于有向图
由于一条边UV只能从U到V,而不能逆行之,那么我们只需要更新出图中任意2个点之间的最短路径。
记F[U,V]表示U到V的最短距离
G[U,V] 是原图中U到V的边的长
对于每对(U,V)我们只要将G[U,V]+F[V,U]来更新答案就行了。
无向图的最小环相对麻烦一些。
因为我们要避免一条无向边被2次走过(被当做2条边)的情况。
FOR EXAMPLE
u v之间有且只有一条边e 我们大可以从U 走到V 然后从V走回U 但是这并不是一个环
算法:
在floyd的同时,顺便算出最小环
g[i][j]=(i,j之间的边长)
dist:=g;
for k:=1 to n do
begin
for i:=1 to k-1 do
for j:=i+1 to k-1 do
answer:=min(answer,dist[i][j]+g[i][k]+g[k][j]);
for i:=1 to n do
for j:=1 to n do
dist[i][j]:=min(dist[i][j],dist[i][k]+dist[k][j]);
end;
关于算法<2>的证明:
一个环中的最大结点为k(编号最大),与他相连的两个点为i,j,这个环的最短长度为g[i][k]+g[k][j]+i到j的路径中,所有结点编号都小于k的最短路径长度
根据floyd的原理,在最外层循环做了k-1次之后,dist[i][j]则代表了i到j的路径中,所有结点编号都小于k的最短路径
综上所述,该算法一定能找到图中最小环。
第二.求经过K条边的最短路径
例题:给出了一张有N个点M条边的加权有向无环图,接下来有Q个询问,每个询问包括2个节点X和Y,要求算出从X到Y的一条路径,使得密度最小(密度的定义为,路径上边的权值和除以边的数量)。
有1 ≤ N ≤ 50,1 ≤ M ≤ 1000,1 ≤ W ≤ 100000,1 ≤ Q ≤ 100000
这道题十分坑爹。
题目里说好是无环图,但是数据里到处都是环。
我刚开始想的方法是用SPFA拆点做
把原图中每个点拆成N-1个点,分别表示经过I条边到达的这个点。因为最多经过N-1条边。
数据中这种环就会像负权环一样导致SPFA永远做下去。
但是暂且不管数据如何。对于这个题目,除了上面讲的SPFA 拆点的做法,FLOYD 也是可以很好解决的
首先这个“密度”很特殊,IJ之间最小密度路径加上JK之间最小路径,不一定就是IK之间的最小密度路径。
所以我们要先枚举经过了P条边 (1<=P<=N-1)
f(i,j,k)=Min{f(i,h,g)+f(h,j,k-g)}。
这个方程是5维的,会超时,如何减小维数呢?
考虑在何处重复决策。注意到f(i,j,k)的选择路径V1-V2-...-Vk,实际上我们只要找到这里的一个点决策即可,而不需每个点都判断过去。这样就很容易想到在最后一个点进行决策。
f(i,j,k)=Min{f(i,h,k-1)+f(h,j,1)}。
这样这个方法的时间复杂度就是0(N^4) 空间复杂度O(N^3)
问题得到了很好的解决。
FLOYD 求最小环的更多相关文章
-
2017";百度之星";程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】
度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...
-
Floyd求最小环!(转载,非原创) 附加习题(原创。)HDU-1599
//Floyd 的 改进写法可以解决最小环问题,时间复杂度依然是 O(n^3),储存结构也是邻接矩阵 int mincircle = infinity; Dist = Graph; ;k<nVe ...
-
2018.09.15 hdu1599find the mincost route(floyd求最小环)
传送门 floyd求最小环的板子题目. 就是枚举两个相邻的点求最小环就行了. 代码: #include<bits/stdc++.h> #define inf 0x3f3f3f3f3f3f ...
-
【BZOJ 1027】 (凸包+floyd求最小环)
[题意] 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金 ...
-
算法复习——floyd求最小环(poj1734)
题目: 题目描述 N 个景区,任意两个景区之间有一条或多条双向的路来连接,现在 Mr.Zeng 想找一条旅游路线,这个路线从A点出发并且最后回到 A 点,假设经过的路线为 V1,V2,....VK,V ...
-
floyd求最小环 模板
http://www.cnblogs.com/Yz81128/archive/2012/08/15/2640940.html 求最小环 floyd求最小环 2011-08-14 9:42 1 定义: ...
-
CF 1206D - Shortest Cycle Floyd求最小环
Shortest Cycle 题意 有n(n <= 100000)个数字,两个数字间取&运算结果大于0的话连一条边.问图中的最小环. 思路 可以发现当非0数的个数很大,比如大于200时, ...
-
弗洛伊德Floyd求最小环
模板: #include<bits/stdc++.h> using namespace std; ; const int INF = 0xffffff0; ]; void Solve(in ...
-
BZOJ_1027_[JSOI2007]_合金_(计算几何+Floyd求最小环)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1027 共三种金属,\(m\)种材料,给出每种材料中三种金属的占比. 给出\(n\)种合金的三种 ...
随机推荐
-
【原创】Java实现手机号码归属地查询
网络上已经有很多的手机号码归属地查询的API接口,但是这些接口总是有一些大大小小的缺陷. 总结一下这些缺陷: 1.要直接将它的搜索框链接形式粘到自己的页面,点击查询的时候还要跳转到他们的网站来展示归属 ...
-
对图片进行各种样式裁对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等剪:圆形、星形、心形、花瓣形等--第三方开源--CustomShapeImageView
CustomShapeImageView在github上的项目主页是:https://github.com/MostafaGazar/CustomShapeImageView 如果仅仅是需要获取圆形. ...
-
路径 (Path)&ndash;nodejs
本模块包含一套用于处理和转换文件路径的工具集.几乎所有的方法只做字符串变换, 不会调用文件系统检查路径是否有效. 通过 require('path') 来加载此模块.以下是本模块所提供的方法: pat ...
-
cocos2d-x 纹理深入研究
转自:http://blog.csdn.net/qq51931373/article/details/9152227 1.纹理控制. 看此代码: CCSprite *pSprite = CCSprit ...
-
Winform 使用DotNetBar 根据菜单加载TabControl
winform 如何使用TabControl 控件来做winform界面框架? 这样的效果: 首先菜单的窗口展示的承载器为TabControl 控件,这个控件本身包含多页面预览和页面初始化. 如图所示 ...
-
body.clientHeight与documentElement.clientHeight
body上的clientHeight会对着内容区域的高度变化而变化,当内容只有100px,则body上只有100px被撑起,返回的clientHeight为100: documentElement.c ...
-
Java Serializable接口(序列化)理解及自定义序列化
1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...
-
Pycharm安装pygame游戏库遇到的问题
正常情况下: 点file-settings-project-project interprter 点右上角的+号,搜索pygame 点击下方 install Package即可 成功 第二种,如果提示 ...
-
【2017-05-02】winform弹出警告框选择性操作、记事本制作、对话框控件和输入输出流
一.winform弹出警告框选择性操作 MessageBox.Show()返回一个枚举类值(第一个参数为弹出窗口显示的内容,第二个参数为弹出窗口的标题,第三个参数为弹出窗口包含的按钮) 先新建一个变量 ...
-
node和yarn
nvm 版本管理工具 https://github.com/coreybutler/nvm-windows/releases nvm-setup nvm install +版本号 加版本 ...