[bzoj1050]旅行

http://hzwer.com/844.html

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 using namespace std;
 7 
 8 struct EDGE{
 9     int u,v,c;
10     bool operator < (EDGE b) const{
11         return c<b.c;
12     }
13 }e[6000];
14 int fa[600],n,m,ansmax=1,ansmin,st,en;
15 int f(int x){return x==fa[x]?x:fa[x]=f(fa[x]);}
16 void init(){for(int i=1;i<=n;i++)fa[i]=i;}
17 int gcd(int a,int b){return b?gcd(b,a%b):a;}
18 
19 int main(){
20     scanf("%d%d",&n,&m);
21     for(int i=0;i<m;i++)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].c);
22     scanf("%d%d",&st,&en);
23     sort(e,e+m);
24     for(int i=0,Min,Max,x;i<m;i=x+1){
25         Min=Max=-1;
26         init();
27         for(x=i;x<m;x++){
28             fa[f(e[x].u)]=f(e[x].v);
29             if(f(st)==f(en)){
30                 Max=e[x].c;
31                 break;}}
32         if(Max==-1){if(!ansmin)return 0&puts("IMPOSSIBLE");else break;}
33         init();
34         for(;x>=0;x--){
35             fa[f(e[x].u)]=f(e[x].v);
36             if(f(st)==f(en)){
37                 Min=e[x].c;
38                 break;}}
39         if(Min==-1){if(!ansmin)return 0&puts("IMPOSSIBLE");else break;}
40         int g=gcd(Max,Min);Max/=g,Min/=g;
41         if(ansmax*Min>ansmin*Max)ansmax=Max,ansmin=Min;
42     }
43     ansmin==1?printf("%d\n",ansmax):printf("%d/%d\n",ansmax,ansmin);
44 }
View Code

 

posted @ 2017-02-01 08:15  KingSann  阅读(94)  评论(0)    收藏  举报