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
推荐指数:※※
来源:http://pat.zju.edu.cn/contests/pat-a-practise/1021
本题直接用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; }