题目描述 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 <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int Father[100001];
struct node
{
int a,b,w;
bool operator<(const node &t)const //sort函数不加第三个参数默认从小到大排列,这里定义类的小于号的重载
{
return w<t.w;
}
};
int Find(int x) //这里使用了并查集的概念
{
if(x!=Father[x])
{
Father[x]=Find(Father[x]); //这里试过非递归,在数据非常大的时候,效率竟然不如递归,超时了
}
return Father[x];
}
int main()
{
int n,m;
node num[100001];
while (scanf("%d%d",&n,&m)!=EOF)
{
for (int i=1; i<=n; i++)
{
Father[i]=i;
}
for (int i=0; i<m; i++)
{
scanf("%d%d%d",&num[i].a,&num[i].b,&num[i].w);
}
sort(num, num+m);
long long sum=0;
for (int i=0; i<m; i++)
{
int x=Find(num[i].a); //此处为并查集的合并操作
int y=Find(num[i].b);
if(x!=y)
{
Father[x]=y;
sum+=num[i].w;
}
}
cout<<sum<<endl;
}
return 0;
}