最近学习了floyd的奇妙用处,求解最小环,自己的领悟写在了纸上。

对于一个最小环,显然至少要包含三个点(此处不把两个点的回路称之为环)

从大体上考虑的话,一定有一个点与左右两侧的点是直接连接的(即不经其他点的松弛),我们不妨设这个点为k

对于floyd,也是也k的遍历作为松弛条件,所以考虑使用floyd求解最小环,显然k是逐渐增大的,也就是说除去k点的那个环剩下的那条最短路中一定不能有k,

否则会出现不是环的路径被错误的判定为环   ,如下图:

假设3已经成功的将1,2松弛,再次利用3来计算最小环时显然此时计算出的s=dis[1][3]+e[1][3]+e[3][2];

但显然这不是一个环啊,所以这就解释了这个算法里第一个for里面i,j都只是循环到k-1的原因.

#include<bits/stdc++.h>  //以hdu1599为例,切记别爆  inf*3即可
using namespace std;
#define inf 99999999
int e[105][105];
int dis[105][105];
int main()
{
int n,m,i,j,k;
while(cin>>n>>m){int a,b,c;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if(i==j) e[i][j]=dis[i][j]=0;
else e[i][j]=dis[i][j]=inf;
for(i=1;i<=m;++i) {
cin>>a>>b>>c;
if(c>e[a][b]) continue;
e[a][b]=e[b][a]=dis[a][b]=dis[b][a]=c;
} int ans=inf;
for(k=1;k<=n;++k)
{
for(i=1;i<k;++i)
for(j=i+1;j<k;++j)
ans=min(ans,dis[i][j]+e[i][k]+e[k][j]);
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
if(ans==inf) puts("It's impossible.");
else cout<<ans<<endl;
}
return 0;
}

上面说的是对于无向图,那么有向图呢,也是如此吗?显然不成立,

对于上面代码红色部分,这个j之所以从i+1开始就可以了是因为无向图的对称性质,而有向图并不具有这个性质,所以需要改动.

但是要是仔细想想的话,有向图的最小环其实只要直接跑一遍floyd,然后遍历一遍dis[i][i]即可,因为图是无向的所以不必担心出现重边啊

//vjos1423为例

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int e[210][210];
int w[210];
int main()
{
int n,m,i,j,k;
cin>>n>>m;
memset(e,inf,sizeof(e));
for(i=1;i<=n;++i) cin>>w[i];
for(i=1;i<=m;++i){
int a,b,c;
cin>>a>>b>>c;
e[a][b]=min(e[a][b],c+w[a]);
}int ans=inf;
for(k=1;k<=n;++k)
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
// e[i][j]=min(e[i][j],e[i][k]+e[k][j]); // for(i=2;i<=n;++i) ans=min(ans,e[1][i]+e[i][1]);
printf("%d\n",e[1][1]==inf?-1:e[1][1]);
return 0;
}

关于Floyd求解最小环的问题的更多相关文章

  1. USACO 4.1 Fence Loops(Floyd求最小环)

    Fence Loops The fences that surround Farmer Brown's collection of pastures have gotten out of contro ...

  2. 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  3. Floyd求最小环!(转载,非原创) 附加习题(原创。)HDU-1599

    //Floyd 的 改进写法可以解决最小环问题,时间复杂度依然是 O(n^3),储存结构也是邻接矩阵 int mincircle = infinity; Dist = Graph; ;k<nVe ...

  4. 2018.09.15 hdu1599find the mincost route(floyd求最小环)

    传送门 floyd求最小环的板子题目. 就是枚举两个相邻的点求最小环就行了. 代码: #include<bits/stdc++.h> #define inf 0x3f3f3f3f3f3f ...

  5. 【BZOJ 1027】 (凸包+floyd求最小环)

    [题意] 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金 ...

  6. 算法复习——floyd求最小环(poj1734)

    题目: 题目描述 N 个景区,任意两个景区之间有一条或多条双向的路来连接,现在 Mr.Zeng 想找一条旅游路线,这个路线从A点出发并且最后回到 A 点,假设经过的路线为 V1,V2,....VK,V ...

  7. floyd求最小环 模板

    http://www.cnblogs.com/Yz81128/archive/2012/08/15/2640940.html 求最小环 floyd求最小环 2011-08-14 9:42 1 定义: ...

  8. CF 1206D - Shortest Cycle Floyd求最小环

    Shortest Cycle 题意 有n(n <= 100000)个数字,两个数字间取&运算结果大于0的话连一条边.问图中的最小环. 思路 可以发现当非0数的个数很大,比如大于200时, ...

  9. 弗洛伊德Floyd求最小环

    模板: #include<bits/stdc++.h> using namespace std; ; const int INF = 0xffffff0; ]; void Solve(in ...

随机推荐

  1. 文件系统、服务、防火墙、SELINUX——安全四大金刚

    一提到安全,大家都会想到防火墙,和文件系统权限.而实际工作环境中,我们在Linux的安全配置,会涉及到四个级别.我们思考一个场景,你要在百度盘中存放一个文件,这个动作需要考虑下面四个权限. 1 fir ...

  2. MySQL Crash Course #12# Chapter 18. Full-Text Searching

    INDEX 由于性能.智能结果等多方面原因,在搜索文本时,全文搜索一般要优于通配符和正则表达式,前者为指定列建立索引,以便快速找到对应行,并且将结果集智能排序.启用查询扩展可以让我们得到未必包含关键字 ...

  3. Python3 ChromeDriver与Chrome版本映射表(更新至v2.43)

    Python3 ChromeDriver与Chrome版本映射表(更新至v2.43) ChromeDriver下载链接:http://chromedriver.storage.googleapis.c ...

  4. 关于编译安装php

    之前也装过一次是nginx和php的, 这次也是... but, 不知道是不是版本的问题还是环境方面的影响, 导致之前的gd库是安装失败的, 所以上次安装zabbix也是失败的, 这次换了5.6.2版 ...

  5. 20145118 《Java程序设计》 实验报告二

    实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 1.没有Lin ...

  6. 20145315《网络对抗》——注入shellcode以及 Return-to-libc攻击实验

    shellcode 准备一段Shellcode 我用的老师的shellcode:\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3 ...

  7. getContext,getApplicationContext和this有什么区别

    使用this, 说明当前类是context的子类,一般是activity application等使用getApplicationContext 取得的是当前app所使用的application,这在 ...

  8. Visual Status各个版本官网下载

    网址:https://www.visualstudio.com/zh-hans/vs/older-downloads/

  9. PMBOK十大知识领域是什么?

    PMBOK十大知识领域是:整合管理.范围管理.时间管理.成本管理.质量管理.人力资源管理.沟通管理.风险管理.采购管理.干系人管理. 各用一句话概括项目管理知识体系十大知识领域: 1.整合管理:其作用 ...

  10. [BZOJ2963][JLOI2011]飞行路线 分层图+spfa

    Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...