ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【AW346】走廊泼水节

2020-02-02 21:52:09  阅读:315  来源: 互联网

标签:泼水节 CH str fa int 走廊 xi FF AW346


题目链接:https://www.acwing.com/problem/content/348/

题目大意:给定一棵 \(n\)个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树, 求增加的边的权值总和最小是多少

solution

很显然 , 对于增加一条连接 \(a_i\) , \(b_i\) 的边 , 要满足图的唯一最小生成树仍然是这棵树 , 它的边权至少为 \(max\left\{dis(u , v)\right\}(u , v \in Path(a_i , b_i)) + 1\) , 只要枚举每一条边 , 求出最小值并求和即可

时间复杂度 : \(O(n^2logn)\)

感觉上面那个算法不太好写 , 而且时间复杂度也不够优秀... 于是可以换种思路 , 考虑 \(kruscal\) 的过程 , 对于一条连接 \(a_i\) , \(b_i\) , 权值为 \(w_i\) 的边 , 它连接起了 \(a_i\) , \(b_i\) 所在的两个连通块 , 对于这两个连通块之间的边的权值一定不会小于这条边 , 设这两个连通块的大小为 \(size_a\) , \(size_b\) , 则这两个连通块之间的连边的总权值最小为 \((size_a \times size_b - 1) \times (w_i + 1)\) , 模拟 \(kruscal\) , 顺带记录连通块大小 , 并统计答案即可

时间复杂度 : \(O(n\alpha)\)

code

#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T &FF) {
    int RR = 1; FF = 0; char CH = getchar();
    for(; !isdigit(CH); CH = getchar()) if(CH == '-') RR = -RR;
    for(; isdigit(CH); CH = getchar()) FF = FF * 10 + CH - 48;
    FF *= RR;
}
inline void file(string str) {
    freopen((str + ".in").c_str(), "r", stdin);
    freopen((str + ".out").c_str(), "w", stdout);
}
const int N = 3e5 + 10;
struct Path{
    int u, v, w;
    friend bool operator < (const Path &ai, const Path &bi) {
        return ai.w < bi.w;
    }
}gi[N];
int fa[N], si[N], n, T;
int find_fa(int xi) {
    return fa[xi] == xi ? xi : fa[xi] = find_fa(fa[xi]);
}
int main() {
    //file("");
    read(T);
    while(T--) {
        read(n);
        int ans = 0;
        for(int i = 1; i <= n; i++) fa[i] = i, si[i] = 1; 
        for(int i = 1; i < n; i++)
            read(gi[i].u), read(gi[i].v), read(gi[i].w);
        sort(gi + 1, gi + n);
        for(int i = 1; i < n; i++) {
            ans += (si[find_fa(gi[i].u)] * si[find_fa(gi[i].v)] - 1) * (gi[i].w + 1);
            si[find_fa(gi[i].u)] += si[find_fa(gi[i].v)]; fa[find_fa(gi[i].v)] = find_fa(gi[i].u);
        }
        cout << ans << endl;
    } 
    return 0;
}

标签:泼水节,CH,str,fa,int,走廊,xi,FF,AW346
来源: https://www.cnblogs.com/magicduck/p/12253888.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有