1021 Deepest Root (25)
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
解题思路:
图的dfs,计算连通分量个数。
先做一次dfs,如果图连通,即dfs次数,若不为1,输出Error: x components,若为1,从第一次dfs得到的最深节点开始,再次dfs,两次得到的节点集合(并集)就是所求最深节点。
这题自己难以想到的是两次dfs得到最深节点。
#include<cstdio>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int n,deepest=0;
vector<int>adj[maxn],temp;
bool vis[maxn]={false};
set<int>s;
void dfs(int v,int deep){
vis[v]=true;
if(deep>deepest){
deepest=deep;
temp.clear();
temp.push_back(v) ;
}else if(deep==deepest){
temp.push_back(v) ;
}
for(int i=0;i<adj[v].size() ;i++){
if(vis[adj[v][i]]==false)
dfs(adj[v][i],deep+1);
}
}
int main(){
int a,b,cnt=0;
scanf("%d",&n);
for(int i=0;i<n-1;i++){
scanf("%d%d",&a,&b);
adj[a].push_back(b);
adj[b].push_back(a);
}
fill(vis,vis+maxn,false);
for(int i=1;i<=n;i++){
if(vis[i]==false){
dfs(i,1);
cnt++;
}
}
if(cnt!=1){
printf("Error: %d components",cnt);
}else{
int s1=temp[0];
for(int i=0;i<temp.size() ;i++)
s.insert(temp[i]) ;
temp.clear() ;
deepest=0;
fill(vis,vis+maxn,false);
dfs(s1,1);
for(int i=0;i<temp.size() ;i++)
s.insert(temp[i]) ;
for(set<int>::iterator it=s.begin() ;it!=s.end() ;it++){
printf("%d\n",*it);
}
}
return 0;
}