1021. Deepest Root (25)-PAT

来源:互联网 发布:淘宝 信息系统 编辑:程序博客网 时间:2024/05/06 02:48

1021. Deepest Root (25)

时间限制
1500 ms
内存限制
32000 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:
51 21 31 42 5
Sample Output 1:
345
Sample Input 2:
51 31 42 53 4
Sample 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 10001vector<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 nodeif(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 graphif(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;}