洛谷 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; }