题意:传送门
题解:枚举+最小生成树
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e2+5;
const int maxm=5e3+5;
const int inf=0x3f3f3f3f;
struct edge{
int u,v,w;
};
edge edges[maxm];
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
int n,m;
int x,y,v;
int s,t;
int f[maxn];
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int find(int x)
{
if(x==f[x]){
return x;
}else{
return f[x]=find(f[x]);
}
}
void merge(int a,int b)
{
int x1=find(a),y1=find(b);
if(x1!=y1){
f[y1]=x1;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
edge &u=edges[i];
scanf("%d%d%d",&u.u,&u.v,&u.w);
}
scanf("%d%d",&s,&t);
sort(edges+1,edges+m+1,cmp);
int ans1=1,ans2=inf;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
f[j]=j;
}
for(int j=i;j<=m;j++){
int a=find(edges[j].u),b=find(edges[j].v);
if(a!=b){
1050merge(a,b);
}
if(find(s)==find(t)){
if(edges[j].w*ans1<edges[i].w*ans2){
ans1=edges[i].w;ans2=edges[j].w;
}
break;
}
}
if(find(s)!=find(t)){
break;
}
}
int c=gcd(ans2,ans1);
ans1/=c;
ans2/=c;
if(ans1==1&&ans2==inf){
printf("IMPOSSIBLE\n");
}else{
if(ans1==1){
printf("%d\n",ans2);
}else{
printf("%d/%d\n",ans2,ans1);
}
}
return 0;
}