[bzoj1050]旅行

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 }