洛谷 P1396 营救

洛谷 P1396 营救

题目链接

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


题目描述

“咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门……

妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了t区,而自己在s区。

该市有m条大道连接n个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从s至t的路线,使得经过道路的拥挤度最大值最小。


输入输出格式

输入格式:

第一行四个数字n,m,s,t。

接下来m行,每行三个数字,分别表示两个区和拥挤度。

(有可能两个区之间有多条大道相连。) 


输出格式:

输出题目要求的拥挤度。


思路

首先我想吐槽这个题目......小明同学防范意识太差了,有个人就以为是好心的,以后怎么在社会上立足啊这

她妈妈有丰富的经验??看来孩子不是丢过一次两次了......

还要保持优雅的风范??孩子都没了还这么镇定......你是个秀儿吧......

种种行为告诉我们这个题......是个变态题

然后我们就有了这个神奇的营救题目

一个kruskal最小生成树就可以水过去了

将边从小到大排序,然后kruskal最小生成树连边,当s和t第一次联通时,当前边的权值就是答案了.

可能是数据水的问题QAQ


代码

#include<bits/stdc++.h>//懒人专用头文件
using namespace std;

int n,m,s,t,pre[200001];//pre数组是储存自己的根节点
struct node{
    int x,y,w;
}bian[100001];//结构体存边

bool comp(node a,node b){//结构体排序
    return a.w<b.w;
}

inline int read(){//快读
    char c=getchar();
    int x=0,f=1;
    while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&& c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

int find(int x){//路径压缩
    if(pre[x]==x)return x;
    return pre[x]=find(pre[x]);
}

int main(){
    n=read();m=read();s=read();t=read();
    for(int i=1;i<=m;i++){
        bian[i].x=read();
        bian[i].y=read();
        bian[i].w=read();        
    }
    for(int i=1;i<=n;i++){
        pre[i]=i;
    }
    sort(bian+1,bian+1+m,comp);
    for(int i=1;i<=m;i++){
        int r1=find(bian[i].x);
        int r2=find(bian[i].y);
        if(r1!=r2)pre[r1]=r2;
        if(find(s)==find(t)){//碰到啦,输出走人
            cout<<bian[i].w<<'
';
            return 0;//愉快的去救自己的儿子吧!别忘记要保持优雅风范
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/loceaner/p/10688544.html