• 【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;
    }
  • 相关阅读:
    Android 中类似ModelWindow的一个实现
    DIV的圆角表现和TAB切换
    Android SDK Manager Google Apis 下载
    Android ADT初始化失败
    2层Folder删除问题,父文件夹删不掉
    【转】Android使用Log4j例子
    编译和解释的区别
    局部变量和全局变量
    函数的几种参数
    格式化
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5186836.html
Copyright © 2020-2023  润新知