BZOJ-1050 旅行comf 并查集+乱搞
2016-01-31 21:56
344 查看
好久以前codevs上做过的,拿着改了改。。
1050: [HAOI2006]旅行comf
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2194 Solved: 1168
[Submit][Status][Discuss]
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不可能相同。
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
用并查集维护十分连通,然后暴力乱搞,没差
代码:(以前的代码风格直接不忍直视)
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int father[6000]={0}; struct data{ int h,t,v; }; data lj[5001]={0}; int find(int x) { if (father[x]==x) return x; else { father[x]=find(father[x]); return father[x]; } } void merge(int x,int y) { int f1=find(x); int f2=find(y); father[f1]=f2; } int cmp(data a,data b) { if (a.v>b.v) return 0; return 1; } int gcd(int a,int b) { int i; i=a%b; while (i!=0) { a=b; b=i; i=a%b; } return b; } int main() { int n,m,p,i,x,y,v1,s,t,ansmin,ansmax,k,j,L; float min; min=9999999.0; ansmax=0;ansmin=0; cin>>n>>m; for (i=1;i<=n;i++) father[i]=i; for (i=1;i<=m;i++) { cin>>x>>y>>v1; lj[i].h=x;lj[i].t=y;lj[i].v=v1; if(find(x)!=find(y)) merge(x,y); } cin>>s>>t; if (find(s)!=find(t)) cout<<"IMPOSSIBLE"<<endl; else { sort(lj+1,lj+m+1,cmp); k=m; while (k>0) { for (i=1;i<=n;i++) father[i]=i; if (find(lj[k].h)!=find(lj[k].t)) merge(lj[k].h,lj[k].t); for (j=k;j>0;j--) { if (find(lj[j].h)!=find(lj[j].t)) merge(lj[j].h,lj[j].t); if (find(s)==find(t)) { if (lj[k].v*1.0/lj[j].v<min) { min=lj[k].v*1.0/lj[j].v; ansmin=lj[j].v; ansmax=lj[k].v; } break; } } k--; } if (ansmax % ansmin==0) cout<<ansmax/ansmin<<endl; else cout<<ansmax/gcd(ansmax,ansmin)<<'/'<<ansmin/gcd(ansmax,ansmin)<<endl; } return 0; }
相关文章推荐
- 2016年1月英语总结
- hdu 2113 Secret Number
- 算法题汇总
- Mina的使用
- BZOJ-1050 旅行comf 并查集+乱搞
- 【HDOJ】4393 Throw nails
- Singleton 单例模式(懒汉方式和饿汉方式)
- 机器学习入门资源不完全汇总
- 面向对象的基础
- Mac 下用 go 开发Android应用环境设置
- angularjs项目下的gulp配置(一)
- 初级文法课程-第1课:名词的种类/名词的数/名词的所有格/冠词;be 动词、一般动词的现在式
- hdu 5616
- 英语总结
- Redis的常用方法总结
- LEETCODE--Power of Three
- [构造]CodeForces 613C Necklace
- cmd命令行杀进程
- linux命令startx报错
- Redis 源码分析(二) 一个 rehash 也不阻塞的哈希表