洛谷P2502 旅行

目录

  • 题目链接
  • 题目思路
  • 代码

题目链接

https://www.luogu.org/problemnew/show/P2502

题目思路

并查集+生成树

代码

#include
#include
#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));//输出 
}

你可能感兴趣的:(并查集,最小生成树)