BZOJ1050 HAOI2006 旅行comf 生成树+枚举
题意:给订一张无向图,求一条S到T的路径,使得路径上的最大边权与最小边权的比值最小
题解:将边由小到大排序,暴力枚举最小边,然后借鉴Kruskal的思想,由小到大加入每一条大于初始边的边,检验S与T是否连通,若连通则更新答案,枚举下一条边。
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std;const int MAXN=500+2; const int MAXM=5000+2; struct EDGE{int u,v,w; }e[MAXM]; int N,M,S,T,f[MAXN],ans_max,ans_min; bool flag;int gcd(int a,int b){ return !b?a:gcd(b,a%b);}bool cmp(EDGE a,EDGE b){ return a.w<b.w;}int Find(int x){ return x==f[x]?x:f[x]=Find(f[x]);}int main(){cin >> N >> M;for(int i=1;i<=M;i++) cin >> e[i].u >> e[i].v >> e[i].w;sort(e+1,e+M+1,cmp);cin >> S >> T;for(int i=1,j;i<=M;i++,flag=0){if(e[i].w==e[i-1].w) continue;for(j=1;j<=N;j++) f[j]=j;for(j=i;j<=M;j++){if(Find(e[j].u)!=Find(e[j].v)) f[Find(e[j].u)]=f[Find(e[j].v)];if(Find(S)==Find(T)){flag=1;break;}}if(flag && (i==1 || ans_max*e[i].w>e[j].w*ans_min)) ans_min=e[i].w,ans_max=e[j].w;}if(!ans_min) cout << "IMPOSSIBLE" << endl;else{int t=gcd(ans_max,ans_min);ans_max/=t,ans_min/=t;if(ans_min==1) cout << ans_max << endl;else cout << ans_max << "/" << ans_min << endl;}return 0; }
View Code
转载于:https://www.cnblogs.com/WDZRMPCBIT/p/6476857.html
BZOJ1050 HAOI2006 旅行comf 生成树+枚举相关推荐
- BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)
[HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点 ...
- bzoj1050: [HAOI2006]旅行comf
题面在这里 题意: 给一个图,每条边有边权. 给一个s和t,如果s和t之间没有路径输出IMPOSSIBLE,否则输出路径上最大边和最小边的比值的最小值. 做法: 你把边从小到大排序.那么对于一个最小值 ...
- [bzoj1050 HAOI2006] 旅行comf (kruskal)
传送门 Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得 ...
- BZOJ1050 [HAOI2006]旅行comf
题目描述: 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径上最大边和最小边 ...
- bzoj1050 [HAOI2006]旅行comf(并查集)
要求路径上最大边与最小边比值的最小值.我们知道,如果固定最小值,最大值越接近最小值,他们的比值越小.因此我们可以采用类似bzoj3454的方法,把所有边从小到大排序,枚举最小值,再枚举最大值,用并查集 ...
- BZOJ1050 [HAOI2006]旅行comf(Kruskal算法)
SPFA是错误的:局部最优不能保证全局最优,因为要求的是比例最小,与路的长短无直接关系 可以设计m^2的算法: 先将边按长度排序,然后每次枚举最小边的长度w[i]作限定,依次加入更大的边, 当加到某条 ...
- bzoj1050 [HAOI2006]旅行comf
题目 枚举最小边,在用kruskal方法来让S与T,联通,这样比值就最优了.. #include<bits/stdc++.h> using namespace std; int f[501 ...
- [BZOJ1050] [HAOI2006] 旅行comf (Kruskal, LCT)
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T ,求一条路径,使得路径上最 ...
- BZOJ1050 [HAOI2006]旅行comf (并查集)
题意分析 一开始想用最短路的方法维护,然后更新信息.失败了. 想了半天,发现跟lrj书上面的一道题很像,看边才5000,暴力可做. 对边排序后枚举sta,直到发现起点和重点在一个联通块里面,统计答案即 ...
最新文章
- 关于C++中数组下标越界不报错的问题
- JavaScript Office文档在线编辑备忘
- 返回动态html,使用硒返回动态页面的html代码
- 三星Galaxy S20:如何开启黑暗模式
- python分布式爬虫及数据存储_二十一 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存...
- [Java基础]并发修改异常
- Altera FPGA程序固化
- python和java哪个好-Python和Java发展前景哪个好?Python开发学习
- (重磅)最快的Hadoop完全分布式运行
- C++多线程map读写加锁
- 一种边播边下的播放策略
- CSND如何转载别人的文章
- ROS激光雷达小车自主导航学习(一)(持续更新中)
- Gitlab Code Review
- 编译原理(7):运行存储分配
- STM32F207ZG GPIO口学习
- setup界面的network configuration 进不去的原因
- 网站关键词排名怎么才能提高?
- 引入uni-app组件时报错:文件查找失败:‘@/compents/uni-popup.vue‘
- 应对安全漏洞:如何将LFI变为RFI