oj 22609 Balancing Act

题意:给出一棵树,求树上一点使得使得删除一点后该树的最大子树最小。

树的重心裸题,直接跑dfs,更新其最大子树大小

#include<bits/stdc++.h>
using namespace std;
const int maxx = 20010;
const int inf = 0x3f3f3f3f;
int vis[maxx],son[maxx];
int ans,d,n;
vector<int>q[maxx];
void dfs(int u)
{
    vis[u]=1;son[u]=0;
    int temp=0;
    for(int i=0;i<q[u].size();i++)
    {
        int v=q[u][i];
        if(vis[v])continue;
        dfs(v);
        son[u]+=son[v]+1;
        temp=max(temp,son[v]+1);//求u为根时子树的最大值
    }
    temp=max(temp,n-son[u]-1);//父节点的那个子树
    if(temp<ans||(temp==ans&&u<d))
    {
        ans=temp;d=u;
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        memset(son,0,sizeof(son));
        int a,b;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)q[i].clear();
        for(int i=1;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            q[a].push_back(b);
            q[b].push_back(a);
        }
        d=0;ans=inf;
        dfs(1);
        printf("%d %d\n",d,ans);
    }
    return 0;
}

 

posted @ 2019-05-30 12:21  灰灰烟影  阅读(137)  评论(0编辑  收藏  举报