题目背景
A 地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。
题目描述
给出A地区的村庄数 N ,和公路数 M ,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)
输入输出格式
输入格式:
第 1 行两个正整数 N,M
下面 M 行,每行 3 个正整数 x, y, t,告诉你这条公路连着 x,y两个村庄,在时间t时能修复完成这条公路。
输出格式:
如果全部公路修复完毕仍然存在两个村庄无法通车,则输出 -1,否则输出最早什么时候任意两个村庄能够通车。
输入输出样例
说明
100000N≤1000,M≤100000
100000x≤N,y≤N,t≤100000
emm,并查集。。
除了这一块儿都是模板。。
认真读好题,
要求任意两个点都能相互到达,
而且一条路径可以由多条路径组成,
而且路径可以同时修建,
这就是取max的原因
根据样例,我们可以修建的路如上图,
怎样最优呢?
使任意两个点都能相互到达而且max最小。
(别误会啊,可不是二分。。)
那看图就能看出来,去掉1到2的那条路径就可以了。
答案就是这样的:
因为路是双向的,所以任意两个点可以相互到达,
而且max=5是所有可行答案中最小的。
下面就是代码实现过程了:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 8 int n,m,ans,t; //模板 9 int fa[200002]; 10 11 struct node{ //模板 12 int x,y,z; 13 }a[100002]; 14 15 int find(int x) //模板 16 { 17 if(fa[x]!=x) return fa[x]=find(fa[x]); 18 else return fa[x]=x; 19 } 20 21 bool cmp(node x,node y) //模板 22 { 23 return x.z <y.z ; 24 } 25 26 int main() 27 { 28 scanf("%d%d",&n,&m); 29 for(int i=0;i<=n;++i) //模板 30 fa[i]=i; 31 for(int i=1;i<=m;++i) 32 scanf("%d%d%d",&a[i].x ,&a[i].y ,&a[i].z ); 33 sort(a+1,a+m+1,cmp); 34 for(int i=1;i<=m;++i) 35 { 36 int dx=find(a[i].x ); //模板 37 int dy=find(a[i].y ); 38 if(dx!=dy) //判断两个点的祖先是否相同 39 { 40 t++; //记录路径数量 41 fa[dx]=fa[dy]; //两个点就联通了! 42 ans=max(ans,a[i].z ); //取最大值 43 if(t==n-1) //路径数就是要等于点数-1的。 44 { 45 printf("%d",ans); 46 return 0; 47 } 48 } 49 } 50 printf("-1"); 51 return 0; 52 }
如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,那么深情的望着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。