[PKU1655]Balancing Act

找樹的重心,樹的分治基礎題

DFS時找到去掉這點後每個聯通分量的點數的最大值並更新ans,最後輸出ans即可


#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int> g[20010];
int T,a[20010],n,ans,anst;
int find(int now,int fa)
{
    int maxt=0,sum=0;
    for (int i=0;i<(int)g[now].size();i++)
    if (g[now][i]!=fa)
    {
        int t=find(g[now][i],now);
        maxt=max(maxt,t);
        sum+=t;
    }
    maxt=max(maxt,n-sum-1);
    if (maxt<ans)
    {
        anst=now;
        ans=maxt;
    }
    return(sum+1);
}
int main()
{
    scanf("%d",&T);
    for (int Ti=1;Ti<=T;Ti++)
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        g[i].clear();
        memset(a,0,sizeof(a));
        int s,t;
        for (int i=1;i<=n-1;i++)
        {
            scanf("%d%d",&s,&t);
            g[s].push_back(t);
            g[t].push_back(s);
        }
        ans=99999999;
        t=find(1,0);
        printf("%d %d\n",anst,ans);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章