BZOJ1050 [HAOI2006]旅行comf (并查集)
题意分析
一开始想用最短路的方法维护,然后更新信息。失败了。
想了半天,发现跟lrj书上面的一道题很像,看边才5000,暴力可做。
对边排序后枚举sta,直到发现起点和重点在一个联通块里面,统计答案即可。
代码总览
#include<bits/stdc++.h>
using namespace std;
const int nmax = 5005;
typedef struct{int f, t, w;
}Edge;
Edge e[nmax];
int fa[505];
int n,m,s,t;
int mmin = 0x3f3f3f3f, mmax = -1,ansofmmin, ansofmmax;
bool cmp(Edge a, Edge b){return a.w > b.w;}
int findset(int x){int rt = x ,temp;while(rt != fa[rt]) rt = fa[rt];while(x != rt){temp = fa[x];fa[x] = rt;x = temp;}return rt;
}
bool unionset(int x, int y){x = findset(x);y = findset(y);if(x == y) return false;else{fa[x ] = y;return true;}
}
bool getans(){sort(e,e+m,cmp);bool isok = false;for(int j = 0;j<m-1;++j){for(int i = 1;i<=n;++i) fa[i] = i;mmin = 0x3f3f3f3f, mmax = -1;for(int i = j ;i<m;++i){if(unionset(e[i].f,e[i].t)){mmin = min(mmin,e[i].w);mmax = max(mmax,e[i].w);}if(findset(s) == findset(t)){isok = true;if(ansofmmax == 0 || 1.0 * ansofmmax / (1.0*ansofmmin) > mmax * 1.0 / (mmin * 1.0) ){ansofmmax = mmax;ansofmmin = mmin;}break;}}}return isok;
}
int main(){scanf("%d %d",&n,&m);for(int i = 0;i<m;++i) scanf("%d %d %d",&e[i].f,&e[i].t,&e[i].w);scanf("%d %d",&s,&t);bool isok = getans();if(!isok) printf("IMPOSSIBLE\n");else {int gcd = __gcd(ansofmmax,ansofmmin);if(ansofmmin / gcd == 1) printf("%d\n",ansofmmax/gcd);else printf("%d/%d\n",ansofmmax/gcd,ansofmmin/gcd);}return 0;
}
BZOJ1050 [HAOI2006]旅行comf (并查集)相关推荐
- bzoj1050 [HAOI2006]旅行comf(并查集)
要求路径上最大边与最小边比值的最小值.我们知道,如果固定最小值,最大值越接近最小值,他们的比值越小.因此我们可以采用类似bzoj3454的方法,把所有边从小到大排序,枚举最小值,再枚举最大值,用并查集 ...
- BZOJ 1050 [HAOI2006]旅行comf(并查集)
1050: [HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000). ...
- HYSBZ - 1050(旅行comf 并查集Java实现)
HYSBZ - 1050(旅行comf Java实现) 原题地址 解法:枚举每一条边,对于这条边,我们需要找到集合中和其值相差最小的最大边,这个集合是指与包括i边在内的ST联通集.对于这一要求,我们只 ...
- bzoj1050: [HAOI2006]旅行comf
题面在这里 题意: 给一个图,每条边有边权. 给一个s和t,如果s和t之间没有路径输出IMPOSSIBLE,否则输出路径上最大边和最小边的比值的最小值. 做法: 你把边从小到大排序.那么对于一个最小值 ...
- BZOJ1050 [HAOI2006]旅行comf
题目描述: 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径上最大边和最小边 ...
- BZOJ1050 [HAOI2006]旅行comf(Kruskal算法)
SPFA是错误的:局部最优不能保证全局最优,因为要求的是比例最小,与路的长短无直接关系 可以设计m^2的算法: 先将边按长度排序,然后每次枚举最小边的长度w[i]作限定,依次加入更大的边, 当加到某条 ...
- [bzoj1050 HAOI2006] 旅行comf (kruskal)
传送门 Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得 ...
- 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 ,求一条路径,使得路径上最 ...
最新文章
- 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程(十五)
- l开头的英文车标是什么车_L开头的英文车标叫什么车
- [Windows][C#][.NET][WPF]基于ArcFace2.0+红外双目摄像头的活体检测
- 我的世界 文件保存位置
- pytorch中的批量归一化BatchNorm1d和BatchNorm2d的用法、原理记录
- Linux服务-NFS服务部署
- React Native在Android当中实践(五)——常见问题
- 为什么 Netflix “永不宕机”?
- 怎样在WIN7系统下安装IIS和配置ASP
- Javascript第二章中switch结构及与if的区别第二课
- 能源管理可视化破冰而出,数字孪生打破传统运维僵局
- GIS空间分析 栅格数据分析3 可达性分析
- python生成热力图_pyHeatMap生成热力图
- 最近刷爆朋友圈的“召唤神龙”
- 百度网盘会员怎么购买最便宜
- 小米手机小技巧:小米手机心率测试
- 吴恩达深度学习相关资源下载地址(蓝奏云)
- HDU 5183 Negative and Positive (NP) (set + 读入外挂 乱搞)
- 优达(Udacity)smartcab
- google colab云服务器使用