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\n",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\n",i); } } return 0; }