bzoj1050 并查集乱搞

impossible打错。。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define rep(i,l,r) for(int i=l;i<r;i++)
 6 #define clr(a,x) memset(a,x,sizeof(a))
 7 using namespace std;
 8 struct edge{
 9     int q,z,v;
10     void read(){
11         scanf("%d%d%d",&q,&z,&v);
12     }
13     bool operator<(const edge &e)const{
14         return v<e.v;
15     }
16 };
17 const int maxn=505,maxm=5005,inf=0x7fffffff;
18 edge e[maxm];
19 int n,m,fa[maxn],mx[maxn],mn[maxn];
20 int find(int a)
21 {
22     return fa[a]==a?a:fa[a]=find(fa[a]);
23 }
24 int gcd(int a,int b)
25 {
26     return b==0?a:gcd(b,a%b);
27 }
28 int main()
29 {
30     cin>>n>>m;
31     rep(i,0,m) e[i].read();
32     int s,t,ansmax=-1,ansmin=-1;
33     cin>>s>>t;
34     sort(e,e+m);
35     rep(i,0,m){
36         rep(j,1,n+1) fa[j]=j;
37         int mx,mn=e[i].v;
38         rep(j,i,m){
39             int a=find(e[j].q),b=find(e[j].z);
40             if(a!=b){
41                 mx=e[j].v;
42                 fa[a]=b;
43             }
44             if(find(s)==find(t)){
45                 if(ansmax==-1||mx*1.0/mn<ansmax*1.0/ansmin)
46                 {
47                     ansmax=mx;
48                     ansmin=mn;
49                 }     
50                 break;
51             }
52         }
53     }
54     if(ansmax==-1) printf("IMPOSSIBLE");
55     else{
56         int gc=gcd(ansmax,ansmin);
57         if(gc==ansmin) printf("%d",ansmax/ansmin);
58         else printf("%d/%d",ansmax/gc,ansmin/gc);
59     }
60     return 0;
61 }
View Code

1050: [HAOI2006]旅行comf

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1809  Solved: 924
[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

 
[Submit][Status][Discuss]
原文地址:https://www.cnblogs.com/chensiang/p/4617173.html