wikioi1001舒服的线路(kruskal)

本文介绍了一种使用Kruskal算法解决特定路径问题的方法,通过将边按权重从大到小排序,并逐步构建最小生成树来找到两点间最大速度比。此算法适用于较小规模的数据集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用kruskal的思想。

因为数据比较小,所以用O(m*m)完全可以过。

思路:

将速度按从大到小排列(你想从小到大也可以的)

然后,从大到小,一个一个枚举。

然后再在里面套一重循环,一个一个加入,直到从s到t有路可走(也就是同属于一个集合),就比较比值,如果小于当前最小值,就更新它。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
struct aaaa{int from,to,v;};
aaaa bian[5010];
int n,m,big=999999999,small=1,aimx,aimy,bing[501];
bool cmp(aaaa a,aaaa b);
void hebing(int a,int b);
int findf(int a);
int gb(int a,int b);
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>bian[i].from>>bian[i].to>>bian[i].v;
    }
    sort(bian+1,bian+1+m,cmp);
    cin>>aimx>>aimy;
    for(int i=1;i<=m;i++){
        memset(bing,0,sizeof(bing));
        for(int j=i;j<=m;j++){
            int fa1=findf(bian[j].from),fa2=findf(bian[j].to);
            if(fa1!=fa2)hebing(fa1,fa2);
            if(findf(aimx)==findf(aimy)){
                if(bian[i].v*1.0/bian[j].v<big*1.0/small){big=bian[i].v;small=bian[j].v;break;}
            }
        }
    }
    if(big==999999999){cout<<"IMPOSSIBLE";}
    else {
        if(big/small*small==big)cout<<big/small;
        else {
            int key=gb(big,small);
            cout<<big/key<<"/"<<small/key;
        }
    }
    return 0;
}
bool cmp(aaaa a,aaaa b){
    return a.v>b.v;
}
int findf(int a)
{
    int b=a;
    while(bing[a]!=0){
        a=bing[a];
    }
    while(bing[b]!=0){
        int t=bing[b];
        bing[b]=a;
        b=t;
    }
    return a;
}
void hebing(int a,int b){
    bing[b]=a;
}
int gb(int a,int b)
{
    if(b==0)return a;
    else return gb(b,a%b);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值