Cod sursa(job #501315)

Utilizator rusu_raduRusu Radu rusu_radu Data 14 noiembrie 2010 18:38:14
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>
#include <cassert>
#include <vector>
#define Nmax 100005
#define InFile "cerere.in"
#define OutFile "cerere.out"

using namespace std;

int n, vf=-1;
int K[Nmax], viz[Nmax], stv[Nmax], ft[Nmax], nr[Nmax];
vector <int> A[Nmax];

void read();
void DFS (int);
void write();

int main()
{
  int i;
  assert (freopen (InFile, "r", stdin));
  assert (freopen (OutFile, "w", stdout));
  read();
  for (i=1; i<=n; i++)
    if (!ft[i])
    {
      stv[++vf]=i; DFS (i);
      break;
    }
  write();
  return 0;
}

void read()
{
  int i, x, y;
  scanf ("%d\n", &n);
  for (i=1; i<=n; i++)
    scanf ("%d ", &K[i]);
  for (i=1; i<n; i++)
  {
    scanf ("%d %d\n", &x, &y);
    ft[y]=x;
    A[x].push_back (y);
  }
}

void DFS (int nd)
{
  int i, lg;
  viz[nd]=1;
  if (K[nd])
    nr[nd]=1+nr[stv[vf-K[nd]]];
  lg=A[nd].size();
  for (i=0; i<lg; i++)
    if (!viz[A[nd][i]])
    {
      stv[++vf]=A[nd][i];
      DFS (A[nd][i]);
      vf--;
    }
}

void write()
{
  int i;
  for (i=1; i<=n; i++)
    printf ("%d ", nr[i]);
  printf ("\n");
}