樹的重心(模板)

Balancing Act

定義dp[i]:以i爲根時最大的子樹的值。對於遍歷到的每個i,比較所有的子樹的大小之後,還要注意比較i這個子樹以外的大小(n-num[rt])。

(圖爲引用自一位大佬的博客)

//#include <bits/stdc++.h>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;
#define maxn 20010
int t;
int dp[maxn];
int num[maxn];
vector<int> g[maxn];
int n;
void dfs(int rt,int fa)
{
    num[rt]=1;dp[rt]=0;
    for(int i=0;i<g[rt].size();i++){
        int v=g[rt][i];
        if(v==fa) continue;
        dfs(v,rt);
        dp[rt]=max(dp[rt],num[v]);
        num[rt]+=num[v];
    }
    dp[rt]=max(dp[rt],n-num[rt]);
}
int main()
{
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++ ) g[i].clear();
        for(int i=1;i<=n-1;i++){
            int u,v;
            scanf("%d %d",&u,&v);
            g[u].push_back(v);
            g[v].push_back(u);
        }
        dfs(1,-1);
        int ans1=1;int ans2=dp[1];
        for(int i=1;i<=n;i++){
            if(dp[i]<ans2){
                ans2=dp[i];
                ans1=i;
            }
        }
        printf("%d %d\n",ans1,ans2);
    }
    return 0;
}

 

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