PAT (Advanced Level) 1021. Deepest Root (25)

先并查集判断连通性,然后暴力每个点作为根节点判即可。

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;

struct Edge
{
    int a,b;
}e[20000];
int n,sz,f[20000],dep,U;
bool flag[20000];
vector<int>g[20000];

int Find(int x)
{
    if(x!=f[x]) return f[x]=Find(f[x]);
    return f[x];
}

void dfs(int x,int d)
{
    dep=max(dep,d); flag[x]=1;
    for(int i=0;i<g[x].size();i++)
        if(flag[g[x][i]]==0) dfs(g[x][i],d+1);
}

void DFS(int x,int d)
{
    U=max(U,d); flag[x]=1;
    for(int i=0;i<g[x].size();i++)
        if(flag[g[x][i]]==0) DFS(g[x][i],d+1);
}

int main()
{
    scanf("%d",&n); sz=n;
    for(int i=1;i<=n;i++) {g[i].clear();f[i]=i;}
    for(int i=1;i<=n-1;i++)
    {
        scanf("%d%d",&e[i].a,&e[i].b);
        g[e[i].a].push_back(e[i].b);
        g[e[i].b].push_back(e[i].a);
    }
    for(int i=1;i<=n-1;i++)
    {
        int fx=Find(e[i].a), fy=Find(e[i].b);
        if(fx!=fy) { sz--; f[fx]=fy; }
    }
    if(sz!=1) printf("Error: %d components
",sz);
    else
    {
        dep=0;
        for(int i=1;i<=n;i++)
        {
            memset(flag,0,sizeof flag);
            dfs(i,1);
        }

        for(int i=1;i<=n;i++)
        {
            U=0;
            memset(flag,0,sizeof flag);
            DFS(i,1);
            if(U==dep) printf("%d
",i);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5499810.html