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 5Sample Output 1:
3 4 5Sample Input 2:
5 1 3 1 4 2 5 3 4Sample Output 2:
Error: 2 components
方法一:DFS
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
#define N 10001
vector<int> edge[N];
int deepest[N];
int visited[N];
int n;
int dfs(int now_node){
if(visited[now_node]==1)
return 0;
visited[now_node]=1;
if(edge[now_node].size()==0)
return 1;
int i,maxdeep=0,tmp;
for(i=0;i<edge[now_node].size();i++){//find a deepest from this node
if(visited[edge[now_node][i]]==0){
tmp=dfs(edge[now_node][i]);
maxdeep=maxdeep>tmp?maxdeep:tmp;
}
}
return maxdeep+1;
}
int main()
{
int i,j;
cin>>n;
for(i=1;i<=n-1;i++){
int v1,v2;
cin>>v1>>v2;
edge[v1].push_back(v2);
edge[v2].push_back(v1);
}
memset(deepest,0,sizeof(deepest));
int max_deep=0;
int flag=0;
for(i=1;i<=n;i++){
if(0==flag)
memset(visited,0,sizeof(visited));
deepest[i]=dfs(i);
max_deep=max_deep>deepest[i]?max_deep:deepest[i];
for(j=i;j<=n;j++){//check if it is a connected graph
if(visited[j]==0){
flag++;
i=j-1;
break;
}
}
}
if(flag>0){
cout<<"Error: "<<flag+1<<" components"<<endl;
}
else{
for(i=1;i<=n;i++){
if(deepest[i]==max_deep)
cout<<i<<endl;
}
}
return 0;
}
方法二:BFS
#include <iostream>
#include <vector>
#include <queue>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
const int NUM = 10000+5;
bool visited[NUM]={false};
int level[NUM]={0},level2[NUM]={0};
vector < vector<int> > v(NUM);
int bfs(int root){//进行bfs
queue<int> q;
int now;
q.push(root);
visited[root]=true;
int ceng = 0;
while(!q.empty()){
int size = q.size();
ceng++;
for(int j=0;j<size;j++){
now = q.front();
q.pop();
for(int i=0;i<v[now].size();i++){
int t = v[now][i];
if(visited[t]==false){
visited[t] = true;
q.push(t);
}
}
}
}
return ceng;
}
int main(int argc, char *argv[]) {
int n,count=0;
cin>>n;
for(int i=0;i<n-1;i++){//构建图的邻接表
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
for(int i=1;i<=n;i++){//找连通分量
if(visited[i]==false){
bfs(i);
count++;
}
}
int i=1;
int res[n+1];
if(count>1){
cout<<"Error: "<<count<<" components"<<endl;
}
else{//求每个节点的层次
int MAX = -1;
for(int k=1;k<=n;k++){
for(int j=0;j<NUM;j++){
visited[j]=false;
}
int t = bfs(k);
res[i++]=t;
if(MAX<t){
MAX = t;
}
}
for(int j=1;j<=n;j++){//输出最大层次对应的节点编号
if(res[j]==MAX){
cout<<j<<endl;
}
}
}
return 0;
}