zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files/编译错误
    连接数据库配置 System.Data.Common.DbProviderFactory
    c# socket 发送邮件
    code first 数据迁移
    adb shell monkey
    汇编语言学习小总结
    zookeeper快速安装配置
    编译自己的Hadoop Eclipse插件
    在Windos上使用Eclipse进行Hadoop开发的环境搭建
    Hive安装配置以及整合HBase和hadoop
  • 原文地址:https://www.cnblogs.com/codetogether/p/7066733.html
Copyright © 2011-2022 走看看