zoukankan      html  css  js  c++  java
  • 【AW346】走廊泼水节

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

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

    solution

    很显然 , 对于增加一条连接 (a_i) , (b_i) 的边 , 要满足图的唯一最小生成树仍然是这棵树 , 它的边权至少为 (maxleft{dis(u , v) ight}(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 imes size_b - 1) imes (w_i + 1)) , 模拟 (kruscal) , 顺带记录连通块大小 , 并统计答案即可

    时间复杂度 : (O(nalpha))

    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;
    }
    
    
  • 相关阅读:
    Java学习个人备忘录之继承
    Java学习个人备忘录之文档注释
    Java学习个人备忘录之数组工具类
    Java学习个人备忘录之关键字static
    Java学习个人备忘录之构造函数&this
    Java学习个人备忘录之面向对象概念
    Java学习个人备忘录之数组
    Java学习个人备忘录之入门基础
    hdoj1162-Eddy's picture(kruskal)
    hdoj1102-Constructing Roads(Kruskal)
  • 原文地址:https://www.cnblogs.com/magicduck/p/12253888.html
Copyright © 2011-2022 走看看