【BZOJ 1050】旅行comf
【题目】
题目传送门旅行comf
Description
给你一个无向图,( ≤ 500)个顶点, ( ≤ 5000)条边,每条边有一个权值 ( < 30000)。给你两个顶点 和 ,求一条路径,使得路径上最大边和最小边的比值最小。如果 和 之间没有路径,输出 “IMPOSSIBLE”,否则输出这个比值,如果需要,表示成一个既约分数。 备注: 两个顶点之间可能有多条路径。
Input
第一行包含两个正整数, 和 。下来的M行每行包含三个正整数:, 和 。表示景点 到景点 之间有一条双向公路,车辆必须以速度 在该公路上行驶。最后一行包含两个正整数 ,,表示想知道从景点 到景点 最大最小速度比最小的路径。 和 不可能相同。1< ≤ 500 ,1 ≤ , ≤ ,0 < < 30000,0 < ≤ 5000
Output
如果景点 到景点 没有路径,输出 “IMPOSSIBLE”。否则输出一个数,表示最小的速度比。
如果需要,输出一个既约分数。
Sample Input&Output
【样例1】
输入
4 2
1 2 1
3 4 2
1 4
输出
IMPOSSIBLE
【样例2】
输入
3 3
1 2 10
1 2 5
2 3 8
1 3
输出
5/4
【样例3】
输入
3 2
1 2 2
2 3 4
1 3
输出
2
【分析】
其实这道题我一开始无从下手,经 dzy 大佬讲解以后,哇,茅塞顿开
主要是这道题里面的 , 都是比较小的,那我们有一种偏暴力的算法
对边权从小到大排序,枚举最小边,然后按顺序把比它大的边加进来,直到 能到达 ,这时最大边就是最后加进来的边
时间复杂度:O()
可以看成一个常数
【代码】
要注意的地方可以通过样例分析出来
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 505
#define M 10005
using namespace std;
int n,m,s,t,num;
int rank[N],father[N];
struct node
{int u,v,w;
}a[M];
bool comp(const node &p,const node &q)
{return p.w<q.w;
}
int gcd(int a,int b)
{int r=a%b;while(r!=0){a=b;b=r;r=a%b;}return b;
}
int find(int x)
{if(father[x]==x) return x;return father[x]=find(father[x]);
}
void merge(int x,int y)
{x=find(x);y=find(y);if(rank[x]<rank[y])swap(x,y);father[y]=x;if(rank[x]==rank[y])rank[x]++;
}
int main()
{int x,y,i,j,k,minn,maxn;double now,ratio=1e+20;scanf("%d%d",&n,&m);for(i=1;i<=m;++i)scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);scanf("%d%d",&s,&t);sort(a+1,a+m+1,comp);for(i=1;i<=m;++i){for(j=1;j<=n;++j){rank[j]=0;father[j]=j;}for(j=i;j<=m;++j){merge(a[j].u,a[j].v);if(find(s)==find(t)){now=a[j].w*1.0/a[i].w*1.0;if(ratio>now){ratio=now;minn=a[i].w;maxn=a[j].w;}}}}if(ratio==1e+20)printf("IMPOSSIBLE");else{k=gcd(minn,maxn);maxn/=k;minn/=k;if(minn==1) printf("%d",maxn);else printf("%d/%d",maxn,minn);}return 0;
}
【BZOJ 1050】旅行comf相关推荐
- BZOJ 1050 旅行comf
题目如下: 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边 ...
- HYSBZ - 1050(旅行comf 并查集Java实现)
HYSBZ - 1050(旅行comf Java实现) 原题地址 解法:枚举每一条边,对于这条边,我们需要找到集合中和其值相差最小的最大边,这个集合是指与包括i边在内的ST联通集.对于这一要求,我们只 ...
- bzoj 1050: [HAOI2006]旅行comf(尺取+最短路)
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3335 Solved: 1852 [Submit][ ...
- [并查集]BZOJ 1050——[HAOI2006]旅行comf
1050: [HAOI2006]旅行comf 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S ...
- BZOJ 1050 [HAOI2006]旅行comf(并查集)
1050: [HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000). ...
- BZOJ 1050 HAOI2006 旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3715 Solved: 2070 [Submit][ ...
- BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)
[HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点 ...
- 【bzoj1050】[HAOI2006]旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2813 Solved: 1534 [Submit][ ...
- bzoj1050: [HAOI2006]旅行comf
题面在这里 题意: 给一个图,每条边有边权. 给一个s和t,如果s和t之间没有路径输出IMPOSSIBLE,否则输出路径上最大边和最小边的比值的最小值. 做法: 你把边从小到大排序.那么对于一个最小值 ...
最新文章
- 计算机到计算机 临时网络,电脑如何设置临时网络
- PAT甲级1025 PAT Ranking:[C++题解]排序、结构体、排名
- html5 打印api,HTML5的API(一)
- windows php的Memcache安装和使用方法
- Java 注解学习笔记
- oracle sql语句 只读,Oracle_SQL语句
- 易混淆知识点(2):display:none与visible:hidden的区别
- 蓝桥杯 ADV-73 算法提高 数组输出
- Openstack的用户登录流程
- ai跟随路径_AI教程:如何沿着对象的路径输入文字?
- 关于安卓图片剪切造成软件崩溃问题的解决方法
- python mro文件_Python中MRO
- C语言求输入一个非负数,返回它组成数字之和
- 台湾半导体加工业之父---张忠谋
- JS获取按键的代码,Js如何屏蔽用户的按键,Js获取用户按键对应的ASII码(兼容所有浏览器)...
- html电影详情页面,电影
- 缺少配色灵感,整理超全超赞的配色工具帮你
- ai直线怎么变折线_用Illustrator制作简单的折线图
- 安卓禁用硬件加速_开/关大不同 Android4.0 GPU硬件加速实测
- BLMOOC2812恼人的青蛙