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 5Sample Output 1:
3 4 5Sample Input 2:
5 1 3 1 4 2 5 3 4Sample Output 2:
Error: 2 components
以下代码有一组“内存超限”,待改进:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define INF 2
vector<vector<int> > road;
vector<bool> used;
int N;
struct node{
int level;
vector<int> son;
};
vector<node> tree;
void bfs(int s){
int i;
queue<int> que;
que.push(s);
used[s] = true;
while(!que.empty()){
int t = que.front();
for(i=1; i<=N; i++){
if(!used[i] && road[t][i]!=INF){
que.push(i);
used[i] = true;
}
}
que.pop();
}
}
int countLevel(int s){
queue<node> que;
int level = 0;
tree[s].level = 0;
que.push(tree[s]);
used.clear();
used.resize(N+1,false);
used[s] = true;
int maxLevel = 0;
while(!que.empty()){
int level = que.front().level;
if(level>maxLevel){
maxLevel = level;
}
for(int i=0; i<que.front().son.size(); i++){
int index = que.front().son[i];
if(!used[index]){
used[index] = true;
tree[index].level = level+1;
que.push(tree[index]);
}
}
que.pop();
}
return maxLevel;
}
int main(int argc, char** argv) {
scanf("%d",&N);
used.resize(N+1,false);
road.resize(N+1,vector<int>(N+1,INF));
tree.resize(N+1);
int i, a, b;
for(i=1; i<N; i++){
scanf("%d%d",&a,&b);
road[a][b] = road[b][a] = 1;
tree[a].son.push_back(b);
tree[b].son.push_back(a);
}
int cnt = 0;
for(i=1; i<=N; i++){
if(!used[i]){
bfs(i);
cnt++;
}
}
if(cnt>1){
printf("Error: %d components\n",cnt);
return 0;
}
int level, max=0;
vector<int> result;
for(i=1; i<=N; i++){
level = countLevel(i);
if(level > max){
max = level;
result.clear();
result.push_back(i);
}else if(level == max){
result.push_back(i);
}
}
for(i=0; i<result.size(); i++){
printf("%d\n",result[i]);
}
return 0;
}