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;
    }
  • 相关阅读:
    杭电 2546 饭卡 (01背包问题)
    杭电2602 Bone Collector
    01背包问题的详细概述
    杭电1003 最大子串(第二次AC) 当作DP的训练吧
    杭电1087 Super Jumping! Jumping! Jumping!(初见DP)
    Virtualenv虚拟环境的创建、激活、及退出
    修改maven本地仓库路径
    PPT如何去除背景音乐(史上最全方案)
    NVIDIA显卡驱动安装步骤
    Python之NumPy(axis=0 与axis=1)区分
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5186836.html
Copyright © 2011-2022 走看看