• 修复公路(并查集)


    因本人太菜,所以刚学并查集,so写的不好请不要骂人。嗯...

    题目背景

    AA 地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。

    题目描述

    给出A地区的村庄数 NN ,和公路数 MM ,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。

    问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)

    输入输出格式

    输入格式:

    第 11 行两个正整数 N,MN,M

    下面 MM 行,每行 33 个正整数 x, y, tx,y,t ,告诉你这条公路连着 x,yx,y 两个村庄,在时间t时能修复完成这条公路。

    输出格式:

    如果全部公路修复完毕仍然存在两个村庄无法通车,则输出 -11 ,否则输出最早什么时候任意两个村庄能够通车。

    输入输出样例

    4 4
    1 2 6
    1 3 4
    1 4 5
    4 2 3
    
    5

        首先根据题意我们发现这是一道并查集的题。

    所以我们可以发现,这道题就是一道并查集模板题。嗯....

    然后再排序一下就可以了.....

    代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct stu
    {
        int x;
        int y;
        int z;
        bool operator <  (const stu &f) const
        {
            return z<f.z;
        }
    }a[110000];
    int fa[110000];
    int n,m;
    int f(int x)
    {
        if(fa[x]==x) return x;
        else return fa[x]=f(fa[x]);
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++) fa[i]=i;
        for(int i=1;i<=m;i++) cin>>a[i].x>>a[i].y>>a[i].z;
        sort(a+1,a+1+m);
        int sum=0;
        sum=n;
        int ans=-1;
        for(int i=1;i<=m;i++)
        {
            int tx=f(a[i].x),ty=f(a[i].y);
            if(tx!=ty)
            {
                fa[tx]=ty;
                sum--;
                if(sum==1)
                {
                    ans=a[i].z;
                    break;
                }
            }
        }
        cout<<ans;
    }

    一般只要你打过并查集模板你就会做......

  • 相关阅读:
    实现主从关系Form中汇总行金额/数量
    Custom.pll : 客制化菜单
    XML publisher 填充空白行数
    PLSQL提交带有模板的报表的方法
    使用Form个性化修改标准Form的LOV2
    在开发Form表单中的三种查询方法
    S3C2440 I2C实现
    NBOOT 基于VS2005的编程与编译(一)
    WINCE 6.0 调大image config.bib
    少用的defined,注意不是define
  • 原文地址:https://www.cnblogs.com/dai-jia-ye/p/9126914.html
Copyright © 2020-2023  润新知