目录
题目链接
https://www.luogu.org/problemnew/show/P2502
题目思路
并查集+生成树
代码
#include<cstdio>
#include<algorithm>
#define r(i,a,b) for(i=a;i<=b;i++)
using namespace std;
struct node{int u,v,w;}q[5001];//结构体
int from,to,n,m,f[501],ansx,ansy,i,j;
bool cmp(node x,node y){return x.w<y.w;}//关键字
int fa(int x){return x==f[x]?x:f[x]=fa(f[x]);}//查找
void judge(int x,int y){f[fa(x)]=fa(y);}//合并
bool check(int x,int y){return fa(x)==fa(y);}//判断
int main()
{
scanf("%d%d",&n,&m);//输入
r(i,1,m) scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].w);//输入
scanf("%d%d",&from,&to);//输入
stable_sort(q+1,q+1+m,cmp);//排序
r(i,1,m)
{
r(j,1,n) f[j]=j;//初始化
r(j,i,m)
{
if(!check(q[j].u,q[j].v)) judge(q[j].u,q[j].v);//合并
if(check(from,to)) break;//已经连接
}
if(i==1&&!check(from,to)){puts("IMPOSSIBLE");return 0;}//不连通
if(!check(from,to)) break;//已找到最优解
if(ansx*q[i].w>=ansy*q[j].w) ansx=q[j].w,ansy=q[i].w;//保存最优解
}
if(!(ansx%ansy)) printf("%d",ansx/ansy);//能完全整除
else
printf("%d/%d",ansx/__gcd(ansx,ansy),ansy/__gcd(ansx,ansy));//输出
}