zoukankan      html  css  js  c++  java
  • 洛谷1111 修复公路

    题目背景

    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

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=100005;
    int fa[maxn],n,m,k;
    bool flag;
    struct Edge{
        int st,ed,w;
    }edge[maxn];
    inline int find(int x){
        if(x==fa[x])    return x;
        return fa[x]=find(fa[x]);
    }
    inline int cmp(Edge a,Edge b){
        return a.w<b.w;
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(register int i=1;i<=n;i++)  fa[i]=i;
        for(register int i=1;i<=m;i++){
            int t;
            scanf("%d%d%d",&edge[i].st,&edge[i].ed,&edge[i].w);
            if(edge[i].st>edge[i].ed){
                t=edge[i].ed;
                edge[i].ed=edge[i].st;
                edge[i].st=t;
            }
        }
        sort(1+edge,1+edge+m,cmp);
        for(register int i=1;i<=m;i++){
            int u=find(edge[i].st);
            int v=find(edge[i].ed);
            if(u!=v){
                fa[u]=v;
                k++;
                if(k==n-1){
                    printf("%d",edge[i].w);
                    flag=true;
                    break;
                }
            }   
        }
        if(flag==false) printf("-1");
        return 0;
    }
  • 相关阅读:
    python3学习之匿名函数
    python3学习之装饰器
    Linux服务器管理神器-IPython
    Linux 安装python3.4
    Linux一些常用操作命令
    Java并发知识分享
    LINUX 学习笔记 账号与群组的管理
    用JAVA写查询一个字符串中是否包含另外一个字符串以及出现的次数
    jQuery性能优化
    jQuery实用工具函数
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9677208.html
Copyright © 2011-2022 走看看