zoukankan      html  css  js  c++  java
  • 【CodeVS1231】最优布线问题

    Description

    学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的。为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接。

    为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用。

    Input

    输入第一行为两个整数n,m(2<=n<=100000,2<=m<=100000),表示计算机总数,和可以互相建立连接的连接个数。接下来m行,每行三个整数a,b,c 表示在机器a和机器b之间建立连接的话费是c。(题目保证一定存在可行的连通方案, 数据中可能存在权值不一样的重边,但是保证没有自环)

    Output

    输出只有一行一个整数,表示最省的总连接费用。

    Sample Input

    3 3

    1 2 1

    1 3 2

    2 3 1

    Sample Output

    2

    题解

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct EdgeNode
    {
        int s,t,v;
    }e[100010];
    int f[100010];
    int n,m,u,v,w,ans = 0,cnt = 0;
    int cmp(const EdgeNode &a,const EdgeNode &b)
    {
        return a.v<b.v;
    }
    int root(int x)
    {
        if (f[x] != x) f[x] = root(f[x]);
        return f[x];
    }
    int unionn(int a,int b)
    {
        f[a] = b;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++) f[i] = i;
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            e[i].s=u; e[i].t=v; e[i].v=w;
        }
        sort(e+1,e+m+1,cmp);
        for (int i=1;i<=m;i++)
            if (root(e[i].s) != root(e[i].t))
            {
                unionn(f[e[i].s],f[e[i].t]);
                ans+=e[i].v;
                cnt ++;
                if (cnt == n-1) break;
            }
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    P7276-送给好友的礼物【dp】
    P4831-Scarlet loves WenHuaKe【组合数学】
    CF461D-Appleman and Complicated Task【并查集】
    P6499-[COCI2016-2017#2]Burza【状压dp】
    CF757F-Team Rocket Rises Again【最短路,DAG支配树】
    Loj#6053-简单的函数【Min25筛】
    P5325-[模板]Min_25筛
    2019.10.6 机房训练赛
    [CSP校内集训]v(记忆化搜索+map优化状压)
    [CSP校内集训]ac(树上启发式合并)
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5186836.html
Copyright © 2011-2022 走看看