floyd原理以及求最小环
floyd这个东西学会了好久了,但是原理总是忘记,或者说没有真正的明白,这里在说一下。
我们要求的是任意的 i,j 之间的最短路径,用动态规划的思想来解决就是f[i,j,k]表示i到j中间节点不超过k的最短路径,那么分两种情况讨论:
case1:经过k,如果经过k,很显然f[i,j,k]=f[i,k,k-1]+f[k,j,k-1]; 由动态规划的一些性质可以知道,这样是无后效性的;
case2:不经过k,那么很简单,f[i,j,k]=f[i,j,k-1];
发现这两个方程中至于k-1有关,这样便可以省去一维空间,变成f[i,j]=max(f[i,j],f[i,k]+f[k,j]);
至于k,只需要迭代就可以了。
————————————————————————————————————————————————————————————————
floyd求最小环:
先来贴个代码:
int mincircle = infinity;
Dist = Graph;
for(int k=;k<nVertex;++k){
//新增部分:
for(int i=;i<k;++i)
for(int j=;j<i;++j)
mincircle = min(mincircle,Dist[i][j]+Graph[j][k]+Graph[k][i]);
//通常的 floyd 部分:
for(int i=;i<nVertex;++i)
for(int j=;j<i;++j){
int temp = Dist[i][k] + Disk[k][j];
if(temp < Dist[i][j])
Dist[i][j] = Dist[j][i] = temp;
}
}
大家可以先仔细看看这代码
发现了吗?只是在普通的floyd基础上又进行了了一个找环操作。相信大家仔细琢磨能琢磨出个大概意思,不顾我要在这里解释2个难理解的地方
1、为什么新增部分放在第K次最短路前面
【最小环的一个算法】令e(u,v)表示u和v之间的连边,再令min(u,v)表示,删除u和v之间的连边之后,u和v之间的最短路最小环则是min(u,v) + e(u,v)
Floyd中的k用来作为每节点进行最短路的更新min(u,v)路过K点,由于k是0~n,如果我们按照k值作为环节点的最大值,则可以取环【名叫第k层环】
dist存两点间的最短距离,g存放原图距离那么第k环的最小环
min= g[l~k]+g[k~r]+dist[l][r] 其中0<l<r<k
其中对dist[l][r]的要求是dist没有经过点值大于k的点的优化。
【反例】如果求第k层环的最小环时 dist有进过k点优化过,那么可能产生dist[l][r]=g[l][k]+g[k][r]
那么结果就变成:min=2*(g[l][k]+g[k][r]) 很明显这只是对一条路径的来回走动,而非环所以第k层环的最小
所以k层环应该要在求 dist有路由k点之前求出!
【结论】k层环的最小环 = g[l~k] + g[k~r] + dist[l][r] {0<l<r<k(dist为k-1层环时候更新的最短路)
2、为什么不能在原数组上直接操作而要两个数组?(一般的floyd都在一个数组上操作)
原因很简单,和第一个问题一样,如果在原数组上操作,就会有dist在前面被优化过,会产生1中的【反例】
floyd原理以及求最小环的更多相关文章
- FLOYD 求最小环
首先 先介绍一下 FLOYD算法的基本思想 设d[i,j,k]是在只允许经过结点1…k的情况下i到j的最短路长度则它有两种情况(想一想,为什么):最短路经过点k,d[i,j,k]=d[i,k,k- ...
- BZOJ_1027_[JSOI2007]_合金_(计算几何+Floyd求最小环)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1027 共三种金属,\(m\)种材料,给出每种材料中三种金属的占比. 给出\(n\)种合金的三种 ...
- 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时, ...
随机推荐
- Linux磁盘管理之磁盘结构、概念、原理01
一.磁盘的分类 磁盘主要有IDE.SATA.SCSI.IDE是比较老的硬盘,数据速度比较慢:SATA是现在用的比较多的,台式机.笔记本大多都用的SATA硬盘:SCSI硬盘速度最快,但是价格相对较高. ...
- linux下怎么查看ssh的用户登录日志
linux下登录日志在下面的目录里: cd /var/log 查看ssh用户的登录日志: less secure linux日志管理: 1. 日志简介 日志对于安全来说,非常重要,他记录了系统每天发生 ...
- android 设置布局为无标题样式
<!-- Application theme. --> <style name="AppTheme" parent="android:Theme.Lig ...
- Java基础语法总结1
一.标识符及字符集 Java语言规定标识符是以字母.下划线"_"或美元符号"$"开始,随后可跟数字.字母.下划线或美元符号的字符序列.Java标识符大小写敏感, ...
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS
上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...
- 关于JavaScript继承的那些事
在JavaScript中,对象的创建可以脱离类型(class free),通过字面量的方式可以很方便的创建出自定义对象. 另外,JavaScript中拥有原型这个强大的概念,当对象进行属性查找的时候, ...
- spring mvc拦截器
Java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取act ...
- marquee标签、插入百度地图
marquee></marquee>可以实现多种滚动效果,无需js控制. 使用marquee标记不仅可以移动文字,也可以移动图片,表格等. 语法:<marquee>... ...
- NOIP提高组2010 关押罪犯
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- 微信JSSDK配置文件说明
微信JSSDK配置文件说明 1.官方配置 wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开, ...