Tree Cutting POJ - 2378+Poj3107+求樹的重心

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=1e8;
const int num=1e4+10;
struct node
{
    int v,next;
}e[2*num];
int head[2*num],cnt;
int dp[num];
int n,ans=inf,id[num];
void addedge(int u,int v)
{
    e[++cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt;
    return ;
}
void dfs(int u,int f)
{
    dp[u]=1;
    int m1=0,m2=0;
    for(int i=head[u];i;i=e[i].next)
    {
        int v=e[i].v;
        if(v==f) continue;
        dfs(v,u);
        dp[u]+=dp[v];
        m1=max(m1,dp[v]);
    }
    m2=max(m1,n-dp[u]);

    if(ans>=m2)
    {
        ans=m2;
        id[u]=m2;
    }

    return ;
}
int main()
{
    int u,v;
    for(int i=1;i<=n;i++)
        id[i]=inf;
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&u,&v);
        addedge(u,v);
        addedge(v,u);
    }
    dfs(1,-1);

    for(int i=1;i<=n;i++)
    {
        if(id[i]==ans)
        {
            printf("%d\n",i);
        }
    }
    return 0;
}

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