zoukankan      html  css  js  c++  java
  • POJ1655 Balancing Act 题解

    CSDN同步

    原题链接

    简要题意:

    给定一棵树,求它的重心,以及 以它为根的最大子树的大小。

    重心的定义:(i) 为根的最大子树最小的 (i) 编号。

    首先扫清一个误区:

    初阶的 ( exttt{Oier}) 可能觉得,那重心就是叶子节点了?

    不是这样的。如果把叶子结点拿起来作为根,那么 除叶子结点外的其它所有节点都是一个子树,所以 一般来说 叶子结点并不是重心。(也不排除深度 (=2) 的情况)

    那么,其实以 (i) 为根的最大子树分为两部分:

    1. 当前以 (i) 为根的子树个数(包括自己),记作 (d_i).

    2. 不包含在 (i) 为根的子树中的,即 (sum - d_i).((sum) 表示一共有多少个点)

    显然,我么可以用一重 ( ext{dfs}) 求出 (d_i),然后打擂即可得出。

    细节:(sum ot = n),只是节点 (leq n),不一定会出现。

    时间复杂度:(O(n)).

    实际得分:(100pts).

    #pragma GCC optimize(2)
    #include<cstdio>
    #include<vector>
    #include<string.h> //memset 在这个库里
    #include<iostream>
    #include<algorithm> //POJ 不支持万能头,只能手写
    using namespace std;
    
    const int N=2e5+1;
    
    inline int read(){char ch=getchar();int f=1; while(!isdigit(ch)) {if(ch=='-') f=-f; ch=getchar();}
    	   int x=0;while(isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;}
    
    int n,mini,minh,T;
    int d[N];
    vector<int> G[N];
    
    inline int dfs(int dep,int fa) {
    	d[dep]=0; int t=0;
    	for(int i=0;i<G[dep].size();i++) {
    		int v=G[dep][i]; if(v==fa) continue;
    		dfs(v,dep); d[dep]+=d[v]+1; //d[i] 是子树大小(不含自己),统计的时候要算儿子自己,所以 +1
    		t=max(t,d[v]+1); //得到最大子树
    	} t=max(t,n-d[dep]-1); //和另一边的子树比较,得到最大子树
    	if(t<mini || (t==mini && dep<minh)) mini=t,minh=dep; //更新答案
    }
    
    int main(){
    	T=read(); while(T--) {
    		n=read();
    		for(int i=1;i<n;i++) {
    			int u=read(),v=read();
    			G[u].push_back(v);
    			G[v].push_back(u); //建图
    		} minh=1e9; mini=1e9; dfs(1,0); //搜索
    		printf("%d %d
    ",minh,mini); //答案
    		memset(d,0,sizeof(d));
    		for(int i=1;i<=n;i++) G[i].erase(G[i].begin(),G[i].end()); //多组数据初始化
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    牛客网 剑指Offer JZ16 合并两个排序的链表
    牛客网 剑指Offer JZ15 反转链表
    牛客网 剑指Offer JZ14 链表中倒数最后k个结点
    牛客网 剑指Offer JZ12 数值的整数次方 经典快速幂
    牛客网 剑指offer-JZ10 矩形覆盖
    牛客网 剑指offer-JZ9 跳台阶扩展问题
    牛客网 剑指offer-JZ8 跳台阶
    牛客网 剑指offer-JZ7 斐波那契数列
    牛客网 剑指offer-JZ6 旋转数组的最小数字
    codility_ BinaryGap
  • 原文地址:https://www.cnblogs.com/bifanwen/p/12639409.html
Copyright © 2011-2022 走看看