(ssl1312)P2502 2006河南省赛第一试 旅行
来源:互联网 发布:php的sleep函数 编辑:程序博客网 时间:2024/06/09 21:34
Time Limit:2000MS
Memory Limit:65536K
Total Submit:155
Accepted:57
Description
Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。Z小镇附近共有N个景点(编号为1,2,3,…,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路。也许是为了保护该地的旅游资源,Z小镇有个奇怪的规定,就是对于一条给定的公路Ri,任何在该公路上行驶的车辆速度必须为Vi。速度变化太快使得游客们很不舒服,因此从一个景点前往另一个景点的时候,大家都希望选择行使过程中最大速度和最小速度的比尽可能小的路线,也就是所谓最舒适的路线。
Input
第一行包含两个正整数,N和M。
接下来的M行每行包含三个正整数:x,y和v。表示景点x到景点y之间有一条双向公路,车辆必须以速度v在该公路上行驶。
最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速度比最小的路径。s和t不可能相同。
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
Hint
【数据范围】
1<N<=500
1<=x,y<=N,0<v<30000,x≠y
0<M<=5000
Source
elba
题解:本题是并查集(并查集详见:这里)`
本题思路为先快排(题目要求最小比),再去合并(本次不需要压缩路径),最后再用个循环去找最小比。
不过输出时有要求用分数,所以要化简,便需要辗转相除法。
var x,y,v,f:array[0..5000]of longint; n,m,s,t,i,j,min,max,d:longint;procedure kp(l,r:longint);//快排var i,j,mid:longint;begin i:=l; j:=r; mid:=v[(l+r)div 2]; repeat while v[i]<mid do inc(i); while v[j]>mid do dec(j); if i<=j then begin x[0]:=x[i]; x[i]:=x[j]; x[j]:=x[0]; y[0]:=y[i]; y[i]:=y[j]; y[j]:=y[0]; v[0]:=v[i]; v[i]:=v[j]; v[j]:=v[0]; inc(i); dec(j); end; until i>j; if l<j then kp(l,j); if i<r then kp(i,r);end;function find(a:longint):longint;//找爸爸(笑~)begin if f[a]<0 then exit(a) else begin f[a]:=find(f[a]); exit(f[a]) end;end;procedure fusion(a,b:longint);//合并var x,y:longint;begin x:=find(a); y:=find(b); if x<>y then begin f[x]:=f[x]+f[y]; f[y]:=x; end;end;function chu(a,b:longint):longint;//辗转相除法begin if b=0 then exit(a) else chu:=chu(b,a mod b);end;begin read(n,m); for i:=1 to m do read(x[i],y[i],v[i]); read(s,t); kp(1,m); max:=v[m]+1; min:=v[1];//最大比啦 for i:=1 to m do//慢慢地枚举,直到找到最小比 begin fillchar(f,sizeof(f),$ff); j:=i-1; while (j<m) and (find(s)<>find(t)) do//没超出范围,而且不是同一集合就合并 begin inc(j); fusion(x[j],y[j]); end; if find(s)<>find(t) then break;//还不是就是去不了了(排除程序自身错误) if v[j]*min<v[i]*max then begin max:=v[j]; min:=v[i]; end;//找最小比 end; if max*v[1]>min*v[m] then writeln('IMPOSSIBLE')//没有路径 else begin d:=chu(min,max);//最大公因数 max:=max div d;//化简 min:=min div d; if max mod min=0 then writeln(max div min) else writeln(max,'/',min); end;end.
- (ssl1312)P2502 2006河南省赛第一试 旅行
- 2006河南省赛第一试 旅行
- 2006河南省赛第一试 旅行(并查集)
- 洛谷 P2502 [HAOI2006]旅行
- 洛谷P2502 旅行 SSL_1226 (并查集)
- 河南省ACM第一届第一题
- 2013河南省赛总结
- 第三届河南省赛
- 2017 河南省赛感想
- 10届河南省赛感受
- 第一届河南省大学生程序设计竞赛题型简要分析
- 河南省第一届大学生程序设计大赛解题报告
- 河南省第一届大学生程序设计大赛解题报告
- 河南省第一届程序设计竞赛___试题三 密码破译
- 2017河南省多校第一场-F(状压DP)
- 09河南省赛 机器人 广搜
- 【ACM河南省赛第五四原题】Substring
- 【第七届河南省赛】F.Turing equation
- 前端开发规范之React应用使用ESLint
- JAVA接口回调、向上转型
- 介绍一款好的电商ERP管理系统
- HP T620购买日志
- 第五章:在STM32给的库中stm32f10x_gpio.h的头文件中出现了这样的代码: #ifdef __cplusplus extern "C" { #endif的
- (ssl1312)P2502 2006河南省赛第一试 旅行
- nginx基础知识小结
- Search Insert Position
- Layui之表单form
- 爬取应用宝首页、应用分类、应用以及应用详情
- js中ajax请求的两种方式
- leetcode 675. Cut Off Trees for Golf Event 广度优先遍历BFS
- Android数据库高手秘籍(二)——创建表和LitePal的基本用法
- maven--pom.xml详解