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时, ...
随机推荐
- SQL Server 2008 R2——VC++ ADO 操作 重复利用_ParameterPtr
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- MySQL入门(二)
一 MySQL概述 MySQL是一个很受欢迎的开源数据库,当我从Oracle转来做MySQL的时候,感觉最深刻的一点就是,这家伙居然是Server和Storage分开的!而且更不能忍的是,它竟然是插件 ...
- Java api 入门教程 之 JAVA的文件操作
I/O类使用 由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择.因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程的一个基本 ...
- LeetCode#227.Basic Calculator II
题目 Implement a basic calculator to evaluate a simple expression string. The expression string contai ...
- 涨知识Style
1.用Access作为后台数据库支撑,书写一个C#写入记录的案例 示例1: using System.Data.OleDb; string sql = "insert into 表 (列1, ...
- 全息眼镜HoloLens可快速捕捉真人3D图像
http://www.d9soft.com/zixun/62287.html 北京时间3月28日午间消息,微软研发部门开发出一种新的3D视频捕捉系统“Holoportation”,可以实现将某人3D图 ...
- 嵌入式Linux驱动学习之路(一)嵌入式系统的软硬件架构
硬件资料: 操作系统:(非虚拟机) zws@z-pc:~$ lsb_release -aNo LSB modules are available.Distributor ID: Ubuntu Desc ...
- Android app 简单的电话拨号器
实现步骤: 1.画UI 可以用拖拽和文本编辑. 2.根据UI写业务逻辑 在MainActivity中的onCreate中编写 //get editText content et_number = ( ...
- tyvj[1087]sumsets
描述 正整数N可以被表示成若干2的幂次之和.例如,N = 7时,共有下列6种不同的方案:1) 1+1+1+1+1+1+12) 1+1+1+1+1+23) 1+1+1+2+24) 1+1+1+4 ...
- Apache 的搭建及vim的简单命令
一. vim 简单命令 pwd 当前路径 ls 当前路径所有目录 cd 目录地址 跳转到指定目录 /xxx 查找xxx x 删除当前字符 n 执行上一次查找 二.为什么使用apa ...