洛谷P2502 旅行

目录

题目链接

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));//输出 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值