Cod sursa(job #2542227)

Utilizator nicolaee2Martinescu Nicolae nicolaee2 Data 9 februarie 2020 18:42:00
Problema Cerere Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>

#define NMAX 100005
using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

int n;
int t[NMAX];
int val[NMAX];
int calc[NMAX];

vector<int> ma[NMAX];

void citire()
{
   fin>>n;
   for(int i=1;i<=n;i++)
   {
      calc[i] = -1;
      fin>>val[i];
   }
   for(int i=1;i<=n-1;i++)
   {
      int x,y;
      fin>>x>>y;
      t[y] = x;
      ma[x].push_back(y);
   }

}

void upTree(int n)
{
   int save = n;
   int k = val[n];
   for(int i=1;i<=k;i++)
      n = t[n];
   if(calc[n] == -1)
   {
      if(val[n] == 0)
      {
         calc[save] = 1;
      }
      else
      {
         upTree(n);
         calc[save] = calc[n] + 1;
      }
   }
   else
   {
      calc[save] = calc[n] + 1;
   }
}

void DFS(int n)
{
   if(calc[n]!=-1)
   {
      ;
   }
   else
   {
      int s = n;

      if(val[s] == 0)
      {
         calc[s] = 0;

      }
      else
      {
         int k = val[n];
         for(int i=1;i<=k;i++)
         {
            s = t[s];
         }

         if(calc[s] != -1)
         {

            calc[n] = calc[s] + 1;

         }
         else
         {
            upTree(n);

         }
      }

   }

   for(int i=0;i<ma[n].size();i++)
   {
      DFS(ma[n][i]);
   }



}

void rezolva()
{
   int r;
   for(int i=1;i<=n;i++)
   {

      if(!t[i])
      {
         r = i;
         break;
      }
   }
   calc[r] = 0;
   DFS(r);
   for(int i=1;i<=n;i++)
      fout<<calc[i]<<" ";

}

int main()
{
   citire();
   rezolva();
}