POJ 3107 求树的重心

来源:互联网 发布:i代表什么矩阵 编辑:程序博客网 时间:2024/05/21 00:53

题意:求出树的所有重心编号,从小到大排序输出

#include<cstring>#include<string>#include<cstdio>#include<cstdlib>#include<iostream>#include<cmath>#include<algorithm>#include<queue>#include<vector>#include<map>#include<list>#include<stack>#include<climits>#include<cctype>#include<bitset>#include<set>#include<sstream>#include<climits>using namespace std;#define mod 1000000007#define PI acos(-1.0)#define INF 0x3f3f3f3ftypedef long long LL;typedef unsigned long long ULL;const int maxn=50005;struct edge{    int to,next;}E[maxn<<1];int n,tol,num;int son[maxn];int head[maxn];bool vis[maxn];int ans[maxn];int siz;void init(){    siz=INF;    tol=0;    memset(vis,0,sizeof(vis));    memset(head,-1,sizeof(head));    memset(son,0,sizeof(son));}void add(int u,int v){    E[tol].to=v;    E[tol].next=head[u];    head[u]=tol++;}void dfs(int u){    vis[u]=1;    son[u]=0;    int tmp=0;    for(int i=head[u];i!=-1;i=E[i].next){        int to=E[i].to;        if(!vis[to]){            dfs(to);            son[u]+=son[to]+1;            tmp=max(tmp,son[to]+1);        }    }    tmp=max(tmp,n-son[u]-1);    if(tmp<siz){         num=0;         siz=tmp;         ans[num++]=u;    }    else if(tmp==siz){        ans[num++]=u;    }}int main(){    while(~scanf("%d",&n)){        init();        for(int i=1;i<=n-1;i++){            int u,v;            scanf("%d%d",&u,&v);            add(u,v);            add(v,u);        }        dfs(1);        sort(ans,ans+num);        printf("%d",ans[0]);        for(int i=1;i<num;i++){            printf(" %d",ans[i]);        }        printf("\n");    }    return 0;}
0 0
原创粉丝点击