1021. Deepest Root

来源:互联网 发布:建设银行mac版网银盾 编辑:程序博客网 时间:2024/05/02 06:24

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

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <deque>
#include <queue>
#include <cstring>
#include <vector>
#include <string>
#include <iomanip>
#include <map>
#include <set>
#include <cmath>
#include <stack>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf 100000
vector<vector<int> >v;
bool visit[10010];
vector<int>temp;
set<int>s;
int n,maxheight=0;
void dfs(int cur,int height)
{
  if(height>maxheight)
  {
    temp.clear();
    temp.push_back(cur);
    maxheight=height;
  }
  else if(height==maxheight)
  {
    temp.push_back(cur);
  }
  visit[cur]=true;
  for(int i=0;i<v[cur].size();i++)
  {
    if(visit[v[cur][i]]==false)
    {
      dfs(v[cur][i],height+1);
    }
  }
}
int main()
{
    scanf("%d",&n);
    v.resize(n+1);
    int a,b,cnt=0;
    for(int i=0;i<n-1;i++)
  {
    scanf("%d %d",&a,&b);
    v[a].push_back(b);
    v[b].push_back(a);
  }
  int s1=0;
  for(int i=1;i<=n;i++)
  {
    if(visit[i]==false)
    {
      dfs(i,1);
      if(i==1)
      {
        for(int j=0;j<temp.size();j++)
        {
          s.insert(temp[j]);
          if(j==0)s1=temp[j];
        }
      }
      cnt++;
    }
  }
  if(cnt>=2)
  {
    printf("Error: %d components", cnt);
  }
  else
  {
    temp.clear();
    maxheight=0;
    fill(visit,visit+10010,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++)
      cout<<*it<<endl;
  }
  return 0;
}

0 0
原创粉丝点击