【题目】

题目传送门旅行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相关推荐

  1. BZOJ 1050 旅行comf

    题目如下: 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边 ...

  2. HYSBZ - 1050(旅行comf 并查集Java实现)

    HYSBZ - 1050(旅行comf Java实现) 原题地址 解法:枚举每一条边,对于这条边,我们需要找到集合中和其值相差最小的最大边,这个集合是指与包括i边在内的ST联通集.对于这一要求,我们只 ...

  3. bzoj 1050: [HAOI2006]旅行comf(尺取+最短路)

    1050: [HAOI2006]旅行comf Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3335  Solved: 1852 [Submit][ ...

  4. [并查集]BZOJ 1050——[HAOI2006]旅行comf

    1050: [HAOI2006]旅行comf 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S ...

  5. BZOJ 1050 [HAOI2006]旅行comf(并查集)

    1050: [HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000). ...

  6. BZOJ 1050 HAOI2006 旅行comf

    1050: [HAOI2006]旅行comf Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3715  Solved: 2070 [Submit][ ...

  7. BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)

    [HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点 ...

  8. 【bzoj1050】[HAOI2006]旅行comf

    1050: [HAOI2006]旅行comf Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2813  Solved: 1534 [Submit][ ...

  9. bzoj1050: [HAOI2006]旅行comf

    题面在这里 题意: 给一个图,每条边有边权. 给一个s和t,如果s和t之间没有路径输出IMPOSSIBLE,否则输出路径上最大边和最小边的比值的最小值. 做法: 你把边从小到大排序.那么对于一个最小值 ...

最新文章

  1. 计算机到计算机 临时网络,电脑如何设置临时网络
  2. PAT甲级1025 PAT Ranking:[C++题解]排序、结构体、排名
  3. html5 打印api,HTML5的API(一)
  4. windows php的Memcache安装和使用方法
  5. Java 注解学习笔记
  6. oracle sql语句 只读,Oracle_SQL语句
  7. 易混淆知识点(2):display:none与visible:hidden的区别
  8. 蓝桥杯 ADV-73 算法提高 数组输出
  9. Openstack的用户登录流程
  10. ai跟随路径_AI教程:如何沿着对象的路径输入文字?
  11. 关于安卓图片剪切造成软件崩溃问题的解决方法
  12. python mro文件_Python中MRO
  13. C语言求输入一个非负数,返回它组成数字之和
  14. 台湾半导体加工业之父---张忠谋
  15. JS获取按键的代码,Js如何屏蔽用户的按键,Js获取用户按键对应的ASII码(兼容所有浏览器)...
  16. html电影详情页面,电影
  17. 缺少配色灵感,整理超全超赞的配色工具帮你
  18. ai直线怎么变折线_用Illustrator制作简单的折线图
  19. 安卓禁用硬件加速_开/关大不同 Android4.0 GPU硬件加速实测
  20. BLMOOC2812恼人的青蛙

热门文章

  1. 红孩儿编辑器的核心控制子系统的函数依赖关系图
  2. java pptx,使用Java将文件.pptx转换为.ppt
  3. 51单片机二进制转bcd码c语言,二进制数转换为BCD码(义隆单片机)
  4. 义隆单片机学习笔记之(四) 编程及烧录
  5. 燕山大学联通新卡绑定校园网
  6. 千淘万漉虽辛苦,吹尽狂沙始见金
  7. 阿里资深架构师推荐:浅谈异地多活及阿里云容灾经验分享
  8. AARRR模型分析方法
  9. AARRR模型——变现:终极目标(下)
  10. Android——.pem格式证书转换为.bks