最小环问题:指的是在一张图中找出一个环,使得这个环的各边的权值之和最小。
方法一:断边法:
1.断开环的一条边(Wij=inf)
2.用Dijstra算法求出i->j的最短路径
3.恢复这条边的长度(Wij)
4.计算环的长度,dist=Dist(i,j)+Wij
5.循环全部边,更新最小值dist即可。

方法二:Floyd算法:
1.一个环中的编号最大的点为K,i和j是与K相邻两点,且满足i<j<k,则该环的长度,dist=Dij+Wik+Wkj,Dij是不经过点K的最短距离
2.使用Floyd算法,当最外层循环到点K时(还没有开始第K次循环),Dij计算未经过点K的最短距离
3.循环全部点,更新dist最小值即可

由此可见,传统的方法一明显比方法二要耗时的多!

方法一:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxx=105;
const int inf=0x7ffffff;
int w[maxx][maxx];
int e[maxx][maxx];//记录权值
int dist[maxx];//求出源点到该点的距离
int p[maxx];//记录前驱节点
int d[maxx][maxx];
int n,m;
int vis[maxx];//记录访问过情况
int ans;//求出最小环
void Dijstra(int u){for(int i=0;i<=n;i++){dist[i]=inf;}int mincost=0;memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){if(u!=i){dist[i]=e[u][i];p[i]=u;}}vis[u]=1;dist[u]=0;for(int i=1;i<=n;i++){int temp=inf;int t=u;for(int j=1;j<=n;j++){if(!vis[j]&&dist[j]<temp){temp=dist[j];t=j;}}if(t==u)break;vis[t]=1;for(int j=1;j<=n;j++){if(e[t][j]<inf){if(!vis[j]&&dist[j]>dist[t]+e[t][j]){dist[j]=dist[t]+e[t][j];p[j]=t;}}}}
}
void Floyd(){ans=inf;for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){if(e[k][i]!=inf){int temp=e[k][i];//暂时保存边权值e[k][i]=inf;//将k->i的边权值赋值为无穷大Dijstra(k);//求出k->i之间的最短路径e[k][i]=temp;//恢复k->i的权值大小if(ans>dist[i]+temp){//如果存在更小的环,则更新ans=dist[i]+temp;}}}}
}
int main(){while(cin>>n>>m){for(int i=0;i<=n;i++){dist[i]=inf;for(int j=0;j<=n;j++){e[i][j]=inf;d[i][j]=w[i][j]=inf;}}for(int i=0;i<m;i++){int a,b,cost;cin>>a>>b>>cost;if(w[a][b]>cost){w[a][b]=w[b][a]=cost;d[a][b]=d[b][a]=cost;e[a][b]=e[b][a]=cost;}}Floyd();if(ans>=inf){cout<<"It's impossible."<<endl;}else{cout<<ans<<endl;}}return 0;
}方法二:
#include<iostream>
#include<cstdio>
#define INF 0x3f3f3f
using namespace std;
int w[110][110],d[110][110];
int n,m;
void floyd()
{int ans=INF;for(int k=1;k<=n;k++){//更新最小环的长度 for(int i=1;i<k;i++){for(int j=i+1;j<k;j++){if(ans>d[i][j]+w[i][k]+w[k][j]){ans=d[i][j]+w[i][k]+w[k][j];}}}//k为环的最大编号for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(d[i][j]>d[i][k]+d[k][j]){d[i][j]=d[i][k]+d[k][j];}}}}if(ans==INF){printf("It's impossible.\n");}else{//输出最小环的权值 printf("%d\n",ans);}
}
int main()
{while(~scanf("%d %d",&n,&m)){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){d[i][j]=INF;w[i][j]=INF;}}int a,b,c;while(m--){scanf("%d %d %d",&a,&b,&c);if(w[a][b]>c) d[a][b]=d[b][a]=w[a][b]=w[b][a]=c;}floyd();}return 0;
}

HDU1599(最小环)相关推荐

  1. HDU1599 find the mincost route Floyd算法求最小环

    find the mincost route 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK, ...

  2. Floyd最小环算法

    问题描述: 给你一张无向图,定义环为从i出发到达j然后从j返回i并且所有点都只经过一次(最少为3个点),求所有环当中经过路径最小的环 算法描述: 首先容易想到的是暴力来枚举环,当删除其中一条边ij后再 ...

  3. 最小环问题(无向图)

    什么是最小环?就是所有组成环的环,边权值最小的环,就是最小环. 我们由一道题,进入这个问题. 链接:hdu1599 find the mincost route Time Limit: 1000/20 ...

  4. 最小环问题 ( Floyed )

    hdu1599 解题报告: 要通过此题就要明白 floyedfloyedfloyed 算法原理及其每步的含义. for(int k=1;k<=n;k++){for(int i=1;i<=n ...

  5. hdu 1599 find the mincost route(找无向图最小环)(floyd求最小环)

    ps(我到今天才知道Floyd的核心思想是动态规划==) hdu 1599 find the mincost route(找无向图最小环) 注意!这里写成   #define data 0x3f3f3 ...

  6. 最小环算法求解(Dijkstra算法+Floyd算法)

    方法一: #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> ...

  7. poj1734(最小环+路径)

    最小环问题:指的是在一张图中找出一个环,使得这个环的各边的权值之和最小. 方法一:断边法: 1.断开环的一条边(Wij=inf) 2.用Dijstra算法求出i->j的最短路径 3.恢复这条边的 ...

  8. 图论 + 数论 ---- CF1325E E. Ehab‘s REAL Number Theory Problem (约数个数 + 枚举 + bfs找最小环)[从图结构优化搜索]

    题目链接 题目大意: 给你nnn个数,每个数保证约数个数不超过777个.问你从中选出若 干个数的乘积是完全平方数,最少要选择多少个数?,不存在输出-1. 题目思路: 1.每个数约数不超过7个→\rig ...

  9. 【图论专题】图的存储与遍历(最小环、所有环的大小)

    整理的算法模板合集: ACM模板 目录 Part 8.1 图的存储与遍历 P2661 信息传递(最小环) P2921 Trick or Treat on the Farm(求所有环的大小) 题单链接: ...

最新文章

  1. Spring MVC中用@ResponseBody转json,对json进行处理方法汇总
  2. SVN错误:SVN Working copy XXX is too old
  3. PHP stripos strpos,strpos()和stripos()函数的区别
  4. 【渝粤教育】 国家开放大学2020年春季 1444药理学(本) 参考试题
  5. node.js Error: connect EMFILE 或者 getaddrinfo ENOTFOUND
  6. html常用标签6-表单标签
  7. 用python画机器猫代码_如何用Python画一只机器猫?| 原力计划
  8. 《Android开发案例驱动教程》
  9. 关于海康威视sdk与海康威视web的史上最精细的教程 (一)
  10. 数据挖掘基础知识(未完待续)
  11. javacc LOOKAHEAD关键字
  12. 计算机基础知识应用电子邮件,计算机基础知识及应用普及
  13. 图虫:科技赋能图片版权领域创新发展
  14. R、RStudio下载与安装方法
  15. 使用IDEA第一次open或者import新的gradle项目出现Refresh gradle project卡死的附解决办法
  16. ubuntu只读文件系统
  17. HTTP请求的交互过程和常见的相应状态码
  18. Vue之引用第三方JS插件,CKPlayer使用
  19. 回收苹果手机,这个平台你知道吗
  20. isin用计算机怎么打,教你如何利用hackintool给你的电脑打缓冲帧

热门文章

  1. 两个数组的交集 II
  2. pandas案例分析
  3. 论文笔记 | CNN 是怎么学到图片绝对位置信息的
  4. 机器视觉应用软件开发步骤及流程
  5. 使用OpenCV校准鱼眼镜头-第2部分
  6. 圆桌讨论:Cloud 2.0时代的工业互联网与智能制造
  7. springMVC 使用WebApplicationContext获取ApplicationContext对象
  8. 爱送礼成中国好前任,谢谢你让我认识了快递员
  9. Java反射 - 动态类加载和重载
  10. MySQL 5.7 密码策略