• codevs1231 最优布线问题


    题目描述 Description

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

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

    输入描述 Input Description

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

    输出描述 Output Description

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

    样例输入 Sample Input

    3 3

    1 2 1

    1 3 2

    2 3 1

    样例输出 Sample Output

    2

    数据范围及提示 Data Size & Hint

    最终答案需要用long long类型来保存

    #include<bits/stdc++.h>
    using namespace std;
    struct edge{
    	int u,v,w;
    }a[100010];
    int n,p[100010],m;
    long long sum;
    int find(int x){return x==p[x]?x:p[x]=find(p[x]);}
    
    bool cmp(edge x,edge y){return x.w<y.w;}
    
    void krustra(){
    	int b=0;
    	for(int i=1;i<=n;i++)p[i]=i;
    	for(int i=0;i<m;i++){
    		if(b==n-1)break;
    		int x=find(a[i].u),y=find(a[i].v);
    		if(x!=y){
    			p[x]=y;
    			sum+=a[i].w;
    			b++;
    		}
    	}
    }
    
    int main(){
    	cin>>n>>m;
    	for(int i=0;i<m;i++)scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
    	sort(a,a+m,cmp);	
    	krustra();
    	cout<<sum<<endl;
    	return 0;
    }
  • 相关阅读:
    Py 获取 Flash Player amf 数据
    字符串出现表情符解决方案(超超超超超级猛)
    常用 JS HOOK 代码段
    atob方法替换方案
    conda httperror解决办法
    requests content-length进行校验了怎么办!
    tensoreflow安装教程(亲测可用)
    Python 程序运行时CPU和内存高解决思路
    Python免安装保姆级教程
    Xpath剔除不需要的标签节点
  • 原文地址:https://www.cnblogs.com/codetogether/p/7066733.html
Copyright © 2020-2023  润新知