图论--树的重心(DFS) 模板

2020-10-28 16:08:41 浏览数 (1)

代码语言:javascript复制
const int maxn=500005;
int tot=0,n;
int ans,size;
int sx[maxn],head[maxn];
int vis[maxn];
struct edge
{
    int to,next;
} eg[maxn];
void add(int u,int v)
{
    eg[tot].to=v;
    eg[tot].next=head[u];
    head[u]=tot  ;
}
void init()
{
    tot=0;
    memset(head,-1,sizeof(head));
    memset(vis,0,sizeof(vis));
}
void dfs(int u)
{
    vis[u]=1;
    sx[u]=1;
    int tmp=0;
    for(int i=head[u]; i!=-1; i=eg[i].next)
    {
        int v=eg[i].to;
        if(!vis[v])
        {
            dfs(v);
            sx[u] =sx[v];
            tmp=max(tmp,sx[v]);
        }
    }
    tmp=max(tmp,n-sx[u]);
    if(size>tmp||size==tmp&&ans>u)
    {
        ans=u;
        size=tmp;
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        init();
        int u,v;
        scanf("%d",&n);
        for(int i=1; i<n; i  )
        {
            scanf("%d%d",&u,&v);
            add(u,v);
            add(v,u);
        }
        size=INF;
        dfs(1);
        printf("%d %dn",ans,size);
    }
}
dfs

0 人点赞