1. 程式人生 > >PTA-1021—— Deepest Root(最後兩組數據錯誤)

PTA-1021—— Deepest Root(最後兩組數據錯誤)

for each print false cte pac base for The deep

題目:

A graph which is connected and acyclic can be considered a tree. The hight 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 (≤) 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 componentswhere 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。參考博客:點擊前往。但依然有兩組數據出錯。

代碼:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<vector>
 4 #include<algorithm>
 5 using namespace std;
 6 struct Node{
7 vector<int> points; 8 }nodes[10001]; 9 10 bool visited[10001]; 11 int n; 12 int height=0,components=0; 13 vector<int> farthestNode; 14 15 void dfs(int root,int level){ 16 visited[root]=true; 17 if(level>height){ //若高度更高,則原本的集合清空,將最高的更新 18 height=level; 19 farthestNode.clear(); 20 farthestNode.push_back(root); 21 }else if(level==height){ //同等高度,將該結點添加進去 22 farthestNode.push_back(root); 23 } 24 for(int i=0;i<nodes[root].points.size();i++){ 25 if(visited[nodes[root].points[i]]==false){ //對子結點進行深搜 26 dfs(nodes[root].points[i],level+1); 27 } 28 } 29 } 30 31 int main(){ 32 cin>>n; 33 if(n==1){ 34 cout<<"1"; 35 return 0; 36 } 37 for(int i=1;i<n;i++){ 38 int a,b; 39 cin>>a>>b; 40 nodes[a].points.push_back(b); 41 nodes[b].points.push_back(a); 42 } 43 memset(visited,0,sizeof(visited)); 44 for(int i=1;i<=n;i++){ 45 if(visited[i]==false){ 46 visited[i]=true; 47 dfs(i,0); 48 components++; 49 } 50 } 51 if(components>1){ 52 cout<<"Error: "<<components<<" components"; 53 }else{ 54 int k=farthestNode[0]; //距離最遠的點 55 farthestNode.clear(); 56 height=0; 57 memset(visited,0,sizeof(visited)); 58 dfs(k,0); //從最遠點再次進行深搜,得到的點全為deepest root 59 farthestNode.push_back(k); //k也為deepest root 60 sort(farthestNode.begin(),farthestNode.end()); 61 for(int i=0;i<farthestNode.size();i++){ 62 cout<<farthestNode[i]<<endl; 63 } 64 } 65 return 0; 66 }

 

PTA-1021—— Deepest Root(最後兩組數據錯誤)