Cod sursa(job #99568)

Utilizator blasterzMircea Dima blasterz Data 11 noiembrie 2007 12:53:08
Problema Zvon Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.44 kb
using namespace std;
#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>
#define pb push_back

int n;
vector<vector<int> > a;


int start[100001], nrfii[100001];
int nrmaxfii[100001];
struct cmp{
  bool operator()(const int &a, const int &b)const
  {
    if(nrfii[a]>nrfii[b]) return 1;
    return 0;
  }
};

inline void solve()
{

  
  vector<int>::iterator it;
  int i, j;
  

  for(i=1;i<=n;++i) sort(a[i].begin(), a[i].end(), cmp());
  start[1]=0;
  
  int Q[100001], p=1, q=1;
  bool use[100001];
  memset(use, 0, sizeof(use));
  use[1]=1;
  Q[1]=1;
  int u;

  

  while(p<=q)
    {
      u=Q[p++];

      for(it=a[u].begin(), i=1;it!=a[u].end();++it,++i)
	{	
	  start[*it]=start[u]+i;
	  Q[++q]=*it;
	  
	}

    }

  int max=0;
  for(i=1;i<=n;++i)
    if(max<start[i]+nrfii[i]) max=start[i]+nrfii[i];

  printf("%d\n", max);
     

}

inline int dfs(int n)
{
  if(!a[n].size()) return 1;

  vector<int>::iterator i;
  int sum=0;
  for(i=a[n].begin();i!=a[n].end();++i)
    sum+=dfs(*i);
  nrmaxfii[n]=sum;
  return sum;
}


int main()
{
  int T, i, p, q;
  freopen("zvon.in","r",stdin);
   freopen("zvon.out","w",stdout);
  scanf("%d\n", &T);
  while(T--)
    {
      scanf("%d\n", &n);
      a.clear();
      a.resize(n+1);
      memset(nrfii, 0, sizeof(nrfii));
      memset(start, 0, sizeof(start));
      for(i=1;i<n;++i)
	{
	  scanf("%d %d\n", &p, &q);
	  a[p].pb(q);
	  ++nrfii[p];
	}
      //dfs(1);
        solve();
    }
  return 0;

}