牛客小白月赛6 挖沟

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gtuif/article/details/81874502

链接: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;
}

猜你喜欢

转载自blog.csdn.net/gtuif/article/details/81874502