【图论】最小环算法
来源:互联网 发布:2016年进出口贸易数据 编辑:程序博客网 时间:2024/05/23 13:52
做vijos1046时想最小环想了半天,还是没想出来,到网上一搜原来是用floyd来求……
转自http://blog.csdn.net/loriex/article/details/19171415
最小环
环,,i,j,k三点,环长则为三点 两两间距,
且路不能有交点,
所以,我们想到map[i][j] + dist[i][k] + dist[j][k]
map记录最短路,dist记录直接相连的边
只要map[i][j]不过k点就算得出一个环
让最短路不过k点
想到floyd的dp方程
结果呼之欲出了吧~~我就不说了,直接上伪代码
/*由于是无向图所以计算可以少一半。。*/dist = map;k = 1->n;{i = 1->k-1;j = i+1->k;ans = min(ans,map[i][j] +dist[i][k] + dist[j][k] );//需注意的是i,j,k三点不能相同,所以循环终止是k-1,i-1。。。i = 1->n;j = 1->i;dist[i][j] = min(dist[i][j],dist[i][k] + dist[k][j]);}
vijos1046代码,最小环实用
#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;#define INF 10000000#define MAX 101int n,m,map[MAX][MAX];int floyd(){int mincircle = INF;int Dist[n+1][n+1];for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++){Dist[i][j] = map[i][j];}for(int k = 1; k <= n; k++){for(int i = 1; i < k; i++)for(int j = i+1; j < k; j++){mincircle = min(mincircle,Dist[i][j]+map[j][k]+map[k][i]);}for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++){Dist[i][j] = min(Dist[i][j],Dist[i][k] + Dist[k][j]);}}return mincircle;}void init(){int b,e,l;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){map[i][j] = INF;}map[i][i] = 0;}for (int i = 1; i <= m; i++){scanf("%d %d %d",&b,&e,&l);map[b][e] = map[e][b] = min(map[b][e],l);}int ans = floyd();if ( ans >= INF ){printf("No solution.");}else{printf("%d",ans);}}int main(){ freopen("in.txt","r",stdin);while(scanf("%d %d",&n,&m) != EOF){init();printf("\n");}return 0;}
0 0
- 【图论】最小环算法
- Floyd最小环算法
- floyd算法求最小环
- Floyd算法求最小环
- 最小环 hdu1599 Floyd算法
- 多源最短路·floyd && 最小环算法
- 最小环 floyd算法 poj 1734
- 无向图最小环算法floy
- 最小环
- 最小环
- 最小环
- 找无向图最小环 floyd算法
- 求无向图最小环算法-floyd
- Floyd算法求无向图最小环
- floyd求最小环
- 最小环 timus1004
- floyed求最小环
- floyd求最小环
- JAVA中clone方法详解
- HDU 3910 Liang Guo Sha
- MYSQL入门学习之十二:存储过程的基本操作
- C++中的字符串内涵
- MYSQL入门学习之十三:自定义函数的基本操作
- 【图论】最小环算法
- 专访曾宪杰:大型网站系统与Java中间件实践
- Leetcode中图的遍历
- 实盘示例记录
- 2014/5/20/翻译
- Android Studio为什么要用Gradle?
- 翻译1
- 输出星星的几个小练习
- Linux常用终端命令之cat、grep、echo