玲珑杯 1126 - 咸鱼旅行 【keuskal】


点击打开链接


Time Limit:3s Memory Limit:128MByte

Submissions:573Solved:105

DESCRIPTION

这个地区可以看作是一个无向图,N个点M条边组成。每个边有一个边权。我们定义一条路径的花费,就是这条路径上最大的边权。
现在有一条咸鱼,想从S走到T,徒步旅行。
咸鱼于是找到了你,想让你告诉他从S到T的最小花费。

INPUT
第一行两个整数,N,M。满足(1 <= N <= 10^5, 0 <= M <= 5*10^5)接下来M行,每行三个整数U,V,C。表示有一个连接U点和V点的边,且边权是C。(1<=C<=10^9)接下来一个行是两个整数S,T(1<=S,T<=n)
OUTPUT
输出答案,如果S不能到达T,输出-1
SAMPLE INPUT
5 51 2 12 3 13 4 14 5 15 1 11 3
SAMPLE OUTPUT
1
题解:

因为kruskal原理是从小向大依次取边,那么用kruskal跑到 st 和 ed 恰好联通时的边即为最大边。

跑一边k'ruskal.满足题意则跳出。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1000000007;
const int maxn=1e5+10;
const int maxm=5e5+10;
int n,m,cnt=0;
int fa[maxn];
struct node{
    int u,v,w;
}edge[maxm*2];
bool cmp(node a,node b){
    return a.w<b.w;
}
int Find(int x){
    if(fa[x]==x) return x;
    else return fa[x]=Find(fa[x]);
}

void addedge(int u,int v,int w){
    edge[++cnt].v=v;
    edge[cnt].w=w;
    edge[cnt].u=u;
}
int kruskal(int st,int ed){
    for(int i=1;i<=n;++i) fa[i]=i;
    sort(edge+1,edge+cnt+1,cmp);
    int tot=0,ans=0;
    for(int i=1;i<=cnt;i++){
        int u=edge[i].u;
        int v=edge[i].v;
        int w=edge[i].w;
        int t1=Find(u);
        int t2=Find(v);
        if(t1!=t2){
            ans=w;
            fa[t1]=t2;
            tot++;
        }
        if(Find(st)==Find(ed)) return ans;
    }
    return -1;
}
int main(){
    int a,b,c,st,ed;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;++i){
        scanf("%d %d %d",&a,&b,&c);
        addedge(a,b,c);
        addedge(b,a,c);
    }
    scanf("%d %d",&st,&ed);
    printf("%d\n",kruskal(st,ed));
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值