• CCF 201703-4 地铁修建(最小生成树)


    题意:A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。地铁由很多段隧道组成,每段隧道连接两个交通枢纽。经过勘探,有m段隧道作为候选,两个交通枢纽之间最多只有一条候选的隧道,没有隧道两端连接着同一个交通枢纽。现在有n家隧道施工的公司,每段候选的隧道只能由一个公司施工,每家公司施工需要的天数一致。而每家公司最多只能修建一条候选隧道。所有公司同时开始施工。作为项目负责人,你获得了候选隧道的信息,现在你可以按自己的想法选择一部分隧道进行施工,请问修建整条地铁最少需要多少天。

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN = 100000 + 10;
    const int MAXT = 200000 + 10;
    int fa[MAXN];
    int Find(int x){
        return fa[x] = (fa[x] == x) ? x : Find(fa[x]);
    }
    struct Edge{
        int a, b, c;
        void read(){
            scanf("%d%d%d", &a, &b, &c);
        }
        bool operator < (const Edge&rhs)const{
            return c < rhs.c;
        }
    }num[MAXT];
    int main(){
        int n, m;
        scanf("%d%d", &n, &m);
        int a, b, c;
        for(int i = 0; i < m; ++i){
            num[i].read();
        }
        sort(num, num + m);
        for(int i = 1; i <= n; ++i) fa[i] = i;
        int ans;
        for(int i = 0; i < m; ++i){
            int x = Find(num[i].a);
            int y = Find(num[i].b);
            if(x == y) continue;
            if(x < y) fa[y] = x;
            else fa[x] = y;
            if(Find(n) == 1){
                ans = num[i].c;
                break;
            }
        }
        printf("%d
    ", ans);
        return 0;
    }
    

      

  • 相关阅读:
    课堂例子验证
    大道至简第三章读后感
    动手动脑例子验证
    各数相加的思路、流程图、源代码及实现截图
    大道至简第二章读后感
    《大道至简》第一章读后感
    个人冲刺08
    个人冲刺07
    构建之法读后感04
    个人冲刺06
  • 原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/7624302.html
Copyright © 2020-2023  润新知