zoukankan      html  css  js  c++  java
  • 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 }

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

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

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

    一切都会过去的。

  • 相关阅读:
    第二代:晶体管计算机
    第一代计算机
    Android应用在不同版本间兼容性处理
    eventBus
    realm
    ijkplayer详解AAA
    USB 3.0规范中译本 第3章 USB 3.0体系结构概览
    ES6 学习笔记
    07_通过上下文获取常见目录
    06_登陆案例保存信息完成
  • 原文地址:https://www.cnblogs.com/Mary-Sue/p/9437503.html
Copyright © 2011-2022 走看看