• 洛谷 P1111 修复公路 Label:并查集


    题目背景

    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

    说明

    N<=1000,M<=100000

    x<=N,y<=N,t<=100000

    代码

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 struct rode{int from,to,time;}e[100005];
     8 int pa[100005],rank[100005];
     9 int n,m,cnt=1;
    10 
    11 bool cmp(rode a,rode b){return a.time<b.time;}
    12 
    13 void init_(){
    14     for(int i=1;i<=100002;i++){
    15         rank[i]=0;pa[i]=i;
    16     }
    17 }
    18 int Find(int a){
    19     if(pa[a]==a) return a;
    20     else return pa[a]=Find(pa[a]);
    21 }
    22 void unite(int a,int b){
    23     int ta=Find(a),tb=Find(b);
    24     if(ta==tb) return;
    25     if(rank[ta]<rank[tb]) pa[ta]=tb;
    26     else{
    27         pa[tb]=ta;
    28         if(rank[ta]==rank[tb]) rank[ta]++;
    29     }
    30 }
    31 
    32 
    33 int main(){
    34 //    freopen("01.in","r",stdin);
    35     scanf("%d%d",&n,&m);
    36     if(m<n-1){puts("-1");return 0;}
    37     
    38     init_();
    39     
    40     for(int i=1;i<=m;i++){
    41         scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].time);
    42     }
    43     
    44     sort(e+1,e+m+1,cmp);
    45     for(int i=1;i<=m;i++){
    46         if(Find(e[i].from)!=Find(e[i].to)) cnt++;
    47         unite(e[i].from,e[i].to);
    48 //        printf("from=%d to=%d time=%d
    ",e[i].from,e[i].to,e[i].time);
    49         if(cnt>=n){
    50             printf("%d
    ",e[i].time);
    51             return 0;
    52         }
    53     }
    54     
    55     puts("-1");return 0;
    56 }

    这次错误很严肃,并查集竟然忘了

    1 int unite(int a,int b){
    2     if(rank[a]<rank[b]) pa[a]=b;
    3     else{
    4         pa[b]=a;
    5         if(rank[a]==rank[b]) rank[a]++;
    6     }
    7 }

    Line22 unite函数 竟然写成这样!!!

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    MSI文件静默安装
    C#文本文件或其他文件新内容追加
    VS2015在线安装包
    Hive创建表时添加中文注释后乱码问题
    scala获取字符串首字符和尾字符
    kafka topic常用命令
    supervisord实例配置
    pandas写数据进入数据库
    supervisord初体验
    python3 安装impyla相关的包
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/5861632.html
Copyright © 2020-2023  润新知