链接:https://www.nowcoder.com/acm/contest/136/H
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
胡队长带领HA实验的战士们玩真人CS,真人CS的地图由一些据点组成,现在胡队长已经占领了n个据点,为了方便,将他们编号为1-n,为了隐蔽,胡队长命令战士们在每个据点出挖一个坑,让战士们躲在坑里。由于需要在任意两个点之间传递信息,两个坑之间必须挖出至少一条通路,而挖沟是一件很麻烦的差事,所以胡队长希望挖出数量尽可能少的沟,使得任意两个据点之间有至少一条通路,顺便,尽可能的∑d[i][j]使最小(其中d[i][j]为据点i到j的距离)。
输入描述:
第一行有2个正整数n,m,m表示可供挖的沟数。 接下来m行,每行3个数a,b,v,每行描述一条可供挖的沟,该沟可以使a与b连通,长度为v。
输出描述:
输出一行,一个正整数,表示要使得任意两个据点之间有一条通路,至少需要挖长的沟。(数据保证有解)
示例1
输入
复制
2 2 1 2 1 1 2 3
输出
复制
1
示例2
输入
复制
3 3 1 2 3 2 3 4 1 3 5
输出
复制
7
备注:
对于100%的测试数据: 1 ≤ n ≤ 100000 1 ≤ m ≤ 500000 1 ≤ v ≤ 10000
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll pre[100005],zz[100005];
struct node1
{
ll u,v,w;
}p[500005];
bool cmp(node1 a,node1 b)
{
return a.w<b.w;
}
ll find(ll x)
{
if(x==pre[x])
return x;
return x=find(pre[x]);
}
void merge(ll x,ll y)
{
ll fx=find(x),fy=find(y);
if(fx==fy)
return;
if(zz[fx]<zz[fy]) pre[fx]=fy;
else
{
pre[fy]=fx;
if(zz[fx]==zz[fy]) zz[fx]++;
}
}
int main()
{
ll n;
ll k;
while(~scanf("%lld %lld",&n,&k))
{
for(ll i=0;i<=n;i++)
{
pre[i] = i;
zz[i] = 0;
}
for(int i = 0; i < k; i++)
{
scanf("%lld %lld %lld", &p[i].u, &p[i].v, &p[i].w);
}
sort(p,p+k,cmp);
ll sum=0;
for(ll i=0;i<k;i++)
{
if(find(p[i].u)!=find(p[i].v))
{
merge(p[i].u,p[i].v);
sum+=p[i].w;
}
}
printf("%lld\n", sum);
}
return 0;
}