码迷,mamicode.com
首页 > Windows程序 > 详细

AcWing 走廊泼水节

时间:2019-08-21 00:00:51      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:size   fat   按秩合并   char   NPU   des   long   printf   最小值   

AcWing 走廊泼水节

Description

  • 给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树。

    求增加的边的权值总和最小是多少。

Input

  • 第一行包含整数t,表示共有t组测试数据。

    对于每组测试数据,第一行包含整数N。

    接下来N-1行,每行三个整数X,Y,Z,表示X节点与Y节点之间存在一条边,长度为Z。

Output

  • 每组数据输出一个整数,表示权值总和最小值。

    每个结果占一行。

Sample Input

2
3
1 2 2
1 3 3
4
1 2 3
2 3 4
3 4 5 

Sample Output

4
17 

Data Size

  • N≤6000,Z≤100

题解:

  • 最小生成树。
  • 思考库鲁斯卡尔的构造过程。先按边权大小排序,每次取一条边,如果边两端的点不在一个集合,就连这条边。那么对于此题,因为是完全图。如果边两段的点不在一个集合,那么两个集合会产生的边数是集合A的点数 * 集合B的点数。那么我们要构造的边就是(点数 * 集合B的点数 - 1)。边权显然必定是此边的边权 + 1。

  • 那么并查集维护就行。(顺带一提,并查集路径压缩和按秩合并可以一起用..

#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 6005
#define int long long
using namespace std;

struct E {int u, v, w;} e[N];
int T, n, cnt, ans;
int fat[N], size[N];

int getFat(int x)
{
    if(x == fat[x]) return x;
    return fat[x] = getFat(fat[x]);
}

void merge(int x, int y, int z)
{
    int fx = getFat(x), fy = getFat(y);
    ans += (size[fx] * size[fy] - 1) * (z + 1);
    if(size[fx] > size[fy]) swap(fx, fy);
    size[fy] += size[fx], fat[fx] = fy;
}

int read()
{
    int x = 0, f = 1; char c = getchar();
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
    return x *= f;
}

bool cmp(E x, E y) {return x.w < y.w;}

signed main()
{
    cin >> T;
    while(T--)
    {
        n = read(), cnt = ans = 0;
        for(int i = 1; i <= n; i++)
            fat[i] = i, size[i] = 1;
        for(int i = 1; i < n; i++)
        {
            e[++cnt].u = read();
            e[cnt].v = read();
            e[cnt].w = read();
        }
        sort(e + 1, e + 1 + cnt, cmp);
        for(int i = 1; i < n; i++)
            if(getFat(e[i].u) != getFat(e[i].v))
                merge(e[i].u, e[i].v, e[i].w);
        printf("%lld\n", ans);
    }
    return 0;
}

AcWing 走廊泼水节

标签:size   fat   按秩合并   char   NPU   des   long   printf   最小值   

原文地址:https://www.cnblogs.com/BigYellowDog/p/11386321.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!