解析:
由于这道题数据规模很小,我们考虑一个看起来不太优秀的算法。
枚举最小边,不断加入大边,直到
s,t
s
,
t
联通。
当然,最开始边输入的时候就判断一下
s,t
s
,
t
能否到达。
就直接并查集维护一下就好了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
inline
ll getint(){
re ll num=0;
re char c;
while(!isdigit(c=gc()));
while(isdigit(c))num=(num<<1)+(num<<3)+(c^48),c=gc();
return num;
}
inline
int gcd(int a,int b){
return b?gcd(b,a-a/b*b):a;
}
struct edge{
int u,v,w;
friend bool operator<(cs edge &a,cs edge &b){
return a.w<b.w;
}
}e[5001];
int n,m;
int fa[501];
int rank[501];
inline
int getfa(int x){
return x==fa[x]?x:fa[x]=getfa(fa[x]);
}
inline
void merge(int i,int j){
i=getfa(i);
j=getfa(j);
if(i==j)return ;
if(rank[i]>rank[j])swap(i,j);
fa[j]=i;
if(rank[i]==rank[j])++rank[i];
}
signed main(){
n=getint();
m=getint();
for(int re i=1;i<=n;++i){
fa[i]=i;
}
for(int re i=1;i<=m;++i){
e[i].u=getint(),e[i].v=getint(),e[i].w=getint();
merge(e[i].u,e[i].v);
}
int s=getint(),t=getint();
if(getfa(s)!=getfa(t)){
puts("IMPOSSIBLE");
return 0;
}
sort(e+1,e+m+1);
int d=1,b=300000;
for(int re i=1;i<=m;++i){
for(int re j=1;j<=n;++j)fa[j]=j;
memset(rank,0,sizeof rank);
for(int re j=i;j<=m&&e[j].w*d<e[i].w*b;++j){
merge(e[j].u,e[j].v);
if(getfa(s)==getfa(t)){
d=e[i].w;
b=e[j].w;
break;
}
}
}
int g=gcd(d,b);
d/=g;
b/=g;
printf("%d",b);
if(d>1)printf("/%d",d);
return 0;
}