[bzoj1050 HAOI2006] 旅行comf (kruskal)
传送门
Description
给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T,求
一条路径,使得路径上最大边和最小边的比值最小。如果S和T之间没有路径,输出”IMPOSSIBLE”,否则输出这个
比值,如果需要,表示成一个既约分数。 备注: 两个顶点之间可能有多条路径。
Input
第一行包含两个正整数,N和M。下来的M行每行包含三个正整数:x,y和v。表示景点x到景点y之间有一条双向公路
,车辆必须以速度v在该公路上行驶。最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速度比
最小的路径。s和t不可能相同。
1<N<=500,1<=x,y<=N,0<v<30000,0<M<=5000
Output
如果景点s到景点t没有路径,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。
如果需要,输出一个既约分数。
Sample Input
【样例输入1】
4 2
1 2 1
3 4 2
1 4
【样例输入2】
3 3
1 2 10
1 2 5
2 3 8
1 3
【样例输入3】
3 2
1 2 2
2 3 4
1 3
Sample Output
【样例输出1】
IMPOSSIBLE
【样例输出2】
5/4
【样例输出3】
2
Solution
没什么明显的提示qwq
题目是要找两条符合条件边求比值,发现m是5000的可以先枚举其中一条边再\(O(m)\)地找另一条边就能行
这个题是要在s和t联通的情况下,找到最小比值,那么如果确定一条最小边,只需要找到最大边最小的的方案使st连通其中的最大边就是当前情况的最优边
于是就想到了kruskal的方法,直接套上去发现所有要求就都满足了ヽ( ̄▽ ̄)ノ
Code
//By Menteur_Hxy
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f; c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}const int N=510,M=5010;
int n,m,s,t,amx,ami;
int fa[N];
double ans=2333333333.0;
struct eds{int fr,to,w;}ed[M];int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
int getf(int x) {return fa[x]==x?x:fa[x]=getf(fa[x]);}
bool cmp(eds x,eds y) {return x.w<y.w;}int main() {n=read(),m=read();F(i,1,m) {int a=read(),b=read(),c=read();ed[i]=(eds){a,b,c};}s=read(),t=read();sort(ed+1,ed+1+m,cmp);
// cout<<endl;F(i,1,m) {F(j,1,n) fa[j]=j;int mi=ed[i].w;F(j,i,m) {int fu=getf(ed[j].fr),fv=getf(ed[j].to);
// cout<<fu<<" "<<fv<<endl;if(fu!=fv) fa[fu]=fv;
// cout<<getf(s)<<" "<<getf(t)<<endl;
// cout<<endl;if(getf(s)==getf(t)) {int mx=ed[j].w;double res=(double)mx/mi;
// cout<<res<<endl;if(res<ans) amx=mx,ami=mi,ans=res;break;}}}if(ans==2333333333.0) puts("IMPOSSIBLE");else if(amx%ami==0) printf("%d",amx/ami);else {int d=gcd(amx,ami);printf("%d/%d",amx/d,ami/d);}return 0;
}
转载于:https://www.cnblogs.com/Menteur-Hxy/p/9371979.html
[bzoj1050 HAOI2006] 旅行comf (kruskal)相关推荐
- [BZOJ1050] [HAOI2006] 旅行comf (Kruskal, LCT)
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T ,求一条路径,使得路径上最 ...
- bzoj1050: [HAOI2006]旅行comf
题面在这里 题意: 给一个图,每条边有边权. 给一个s和t,如果s和t之间没有路径输出IMPOSSIBLE,否则输出路径上最大边和最小边的比值的最小值. 做法: 你把边从小到大排序.那么对于一个最小值 ...
- 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 生成树+枚举
题意:给订一张无向图,求一条S到T的路径,使得路径上的最大边权与最小边权的比值最小 题解:将边由小到大排序,暴力枚举最小边,然后借鉴Kruskal的思想,由小到大加入每一条大于初始边的边,检验S与T是 ...
- BZOJ1050 [HAOI2006]旅行comf
题目描述: 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径上最大边和最小边 ...
- bzoj1050 [HAOI2006]旅行comf(并查集)
要求路径上最大边与最小边比值的最小值.我们知道,如果固定最小值,最大值越接近最小值,他们的比值越小.因此我们可以采用类似bzoj3454的方法,把所有边从小到大排序,枚举最小值,再枚举最大值,用并查集 ...
- BZOJ1050 [HAOI2006]旅行comf (并查集)
题意分析 一开始想用最短路的方法维护,然后更新信息.失败了. 想了半天,发现跟lrj书上面的一道题很像,看边才5000,暴力可做. 对边排序后枚举sta,直到发现起点和重点在一个联通块里面,统计答案即 ...
- 【bzoj1050】[HAOI2006]旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2813 Solved: 1534 [Submit][ ...
最新文章
- 有关oracle数据库中的日期显示问题
- mysql select语句最简_10个mysql中select语句的简单用法
- 编写unit test以及自动化测试WebDriver
- mysql数据记录更新版本问题_MySQL版本升级遇到的问题小结
- Ubuntu常用安装源
- cat查看tomcat日志 linux_linux怎么使用cat命令查看文件? linux中cat命令的使用方法
- ftb测试软件,EXFO推出FTB-2光纤测试平台
- 实战_23_高可用负载均衡集群的实现(Mycat+ZK +HAProxy + Keepalived)
- wordcount C
- 火绒规则 禁止所有软件的安装_十大机械设计软件对比,附所有软件安装资料...
- 解决eclipse中mybatis的xml配置文件无代码提示问题
- 2021高考成绩河北查询时间,2021年高考成绩什么时候出来-2021高考成绩公布时间...
- 北京朝阳行政区划(朝阳区街道行政区划) 用于shp数据转为geojson格式作为ECharts地图
- python遍历json数据方法
- QQ向陌生人聊天的autoit脚本
- 第九天:操作符详解(一)与扫雷游戏
- Power BI Desktop 微软官方入门教程
- 宝塔下 nginx 支持图片放缩
- python可以构建sem模型_Python Pandas Series.sem()用法及代码示例
- C语言中extern用法详解
热门文章
- python默认参数只被解释一次_深入讲解Python函数中参数的使用及默认参数的陷阱...
- matlab vision工具箱使用手册,matlab-Computer Vision System ToolBox的系统对象使用
- 升降压斩波电路matlab,升降压直流斩波电路及matlab仿真.doc
- 自学前端的高效学习路线.avi
- 程序语言基础:解释程序基本原理笔记
- 7个免费的Linux FTP客户端工具
- python一般学多久可以考试_为何Python适合初学者 一般Python要学习多久
- 微软登录界面加载不出_微软要硬了,做出这个目前最好用的浏览器
- mysql2014授权设置_mysql权限管理(2014-09-15)
- mysql 5.7.23要钱吗_最新mysql 5.7.23安装配置图文教程