P1111 修复公路

题目背景

A 地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。

题目描述

给出A地区的村庄数 N ,和公路数 M ,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)

输入输出格式

输入格式:

 

第 1 行两个正整数 N,M

下面 M 行,每行 3 个正整数 x, y, t,告诉你这条公路连着 x,y两个村庄,在时间t时能修复完成这条公路。

 

输出格式:

 

如果全部公路修复完毕仍然存在两个村庄无法通车,则输出 -1,否则输出最早什么时候任意两个村庄能够通车。

 

输入输出样例

输入样例#1: 复制
4 4
1 2 6
1 3 4
1 4 5
4 2 3
输出样例#1: 复制
5

说明

100000N1000,M100000

100000xN,yN,t100000

 

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 }

 


如果你不开心,那我就把右边这个帅傻子分享给你吧, 

你看,他这么好看,那么深情的望着你,你还伤心吗? 

真的!这照片盯上他五秒钟就想笑了。 

一切都会过去的。

posted @ 2018-08-07 15:54  孟东行#  阅读(305)  评论(0编辑  收藏  举报