- Deepest Root (25)
时间限制
1500 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=10000) which is the number of nodes, and hence the nodes are numbered from 1 to N. Then N-1 lines follow, each describes an edge by given the two adjacent nodes’ numbers.
Output Specification:
For each test case, print each of the deepest roots in a line. If such a root is not unique, print them in increasing order of their numbers. In case that the given graph is not a tree, print “Error: K components” where K is the number of connected components in the graph.
Sample Input 1:
5
1 2
1 3
1 4
2 5
Sample Output 1:
3
4
5
Sample Input 2:
5
1 3
1 4
2 5
3 4
Sample Output 2:
Error: 2 components
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=10010;
int n;
int ans[maxn]={0};
int cnt=0;
vector<int>g[maxn];
int vis[maxn]={0};
int cp=0;
int dpn=0;
void DFS(int s,int k){
if(k>dpn){
dpn=k;
}
vis[s]=1;
for(int i=0;i<g[s].size();i++){
if(vis[g[s][i]]==0){
vis[g[s][i]]=1;
DFS(g[s][i],k+1);
}
}
}
void dfs(int s){
vis[s]=1;
for(int i=0;i<g[s].size();i++){
if(vis[g[s][i]]==0){
dfs(g[s][i]);
}
}
}
void traverse(){
for(int i=1;i<=n;i++){
if(vis[i]==0){
dfs(i);
cp++;
}
}
}
int main(){
scanf("%d",&n);
int a,b;
for(int i=1;i<n;i++){
scanf("%d%d",&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
traverse();
if(cp>1){
printf("Error: %d components\n",cp);
return 0;
}
int dp=0;
for(int i=1;i<=n;i++){
dpn=0;
fill(vis,vis+maxn,0);
DFS(i,1);
if(dpn>dp){
cnt=0;
ans[cnt++]=i;
dp=dpn;
}
else if(dpn==dp){
ans[cnt++]=i;
}
}
sort(ans,ans+cnt);
for(int i=0;i<cnt;i++){
printf("%d\n",ans[i]);
}
return 0;
}