• P1111 修复公路


     P1111 修复公路

      • 550通过
      • 1.6K提交
    • 题目提供者该用户不存在
    • 标签并查集
    • 难度普及/提高-

    提交该题 讨论 题解 记录

     

    题目背景

    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

    裸的最小生成树,没什么好讲的。

    AC代码:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define N 200100
    struct node{
        int u,v,w;
    }e[N];
    int n,m,k,ans,fa[N];
    inline int read(){
        register int x=0,f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return x*f;
    }
    inline bool cmp(const node &a,const node &b){
        return a.w<b.w;
    }
    int find(int x){
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    int main(){
        n=read();m=read();
        for(int i=1;i<=m;i++) e[i].u=read(),e[i].v=read(),e[i].w=read();
        sort(e+1,e+m+1,cmp);
        for(int i=1;i<=n;i++) fa[i]=i;
        for(int i=1;i<=m;i++){
            int fx=find(e[i].u),fy=find(e[i].v);
            if(fx!=fy){
                fa[fy]=fx;
                ans=max(ans,e[i].w);
                if(++k==n-1) break;
            }
        }
        printf("%d
    ",k==n-1?ans:-1);
        return 0;
    } 
  • 相关阅读:
    C#数组添加元素
    C#数组排序方法
    C#遍历数组
    C#动态数组ArrayList
    C#传递数组参数
    基础题(四)
    基础题(三)
    CMDB概述(二)
    CMDB概述(一)
    Django(基础篇)
  • 原文地址:https://www.cnblogs.com/shenben/p/5734280.html
Copyright © 2020-2023  润新知