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

                                                 洛谷  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

    说明

    N<=1000,M<=100000

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

    思路:并查集模板题            难度:普及/提高-

    #include<algorithm>
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int n,m,t,tot;
    int fa[1001];
    struct s
    {
        int o,p,q;
    }k[100001];
    int find(int x)
    {
        if(fa[x]==x) return x;
        else return fa[x]=find(fa[x]);
    }
    int cmp(s x,s y)
    {
        return x.o<y.o;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            fa[i]=i;
        for(int i=1;i<=m;i++)
            scanf("%d%d%d",&k[i].p,&k[i].q,&k[i].o);
        sort(k+1,k+m+1,cmp);
        for(int i=1;i<=m;i++)
        {
            int x=find(k[i].p),y=find(k[i].q);
            if(x==y) continue;
            fa[x]=y;
            tot++;
            if(tot==n-1)
            {
                t=i;
                break;
            }
        }
        if(t==0) printf("-1");
        else printf("%d",k[t].o);
        return 0;
    }
  • 相关阅读:
    TC SRM 591 (Div2. Practice only)
    SDL2 简单实现图片缩放移动查看
    Linux下socket编程 address already in use 问题
    POJ 2155 二维树状数组
    OJ开发笔记(1)
    开通博客啦~
    [转]STL transform算法中使用toupper函数
    Monkey and Banana HDU 1069
    Ignatius and the Princess IV HDU 1029
    Dungeon Master POJ 2251
  • 原文地址:https://www.cnblogs.com/v-vip/p/8597905.html
Copyright © 2011-2022 走看看