Cod sursa(job #1065469)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 23 decembrie 2013 13:20:52
Problema Cerere Scor 20
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.06 kb
#include <fstream>
#include <vector>
using namespace std;

const int NMAX = 100001;
int n, root, top = 0;
int grand[NMAX], dad[NMAX], sol[NMAX], level[NMAX];
vector < int > son[NMAX];


void init(){
  for (int i = 1; i <= n; ++i)
    sol[i] = NMAX;
}

void get_input(){
  ifstream in("cerere.in");
  in >> n;

  init();
  for(int i = 1; i <= n; ++i){
    in >> grand[i];
    if (grand[i] ==0 ) sol[i] = 0;

  }
  for(int i = 1; i < n; ++i ){
    int a, b;
    in >> a >> b;
    dad[b] = a;
    son[a].push_back(b);

  }
  in.close();
}

int find_root(){
  for( int i = 1; i <= n; ++i)
    if (dad[i] == 0) return i;
}

void dfs(int node){
  int sz = son[node].size();
  top++;
  level[top] = node;
  for (int i = 0; i<sz; ++i){
    int monk = son[node][i];
    if (sol[monk] == NMAX ) {
      sol[monk] = sol[ level[top-grand[monk]] ] + 1;
    }
    dfs(monk);
  }
  top--;
}

void put_output(){
  ofstream out("cerere.out");
  for (int i = 1; i <= n; ++i)
    out << sol[i] << " ";
  out.close();
}

int main(){
  get_input();
  root = find_root();
  dfs(root);
  put_output();
}