Cod sursa(job #1065452)

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

const int NMAX = 100001;
int n, root;
int grand[NMAX], dad[NMAX], sol[NMAX];
vector < int > son[NMAX];
queue <int> q;
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 find_level(int monkey){
  int nr = grand[monkey];
  int monk,ok = 0;
  int aux = monkey;
    while (nr != 0){
      monk = dad[aux];
      aux= monk;
      nr--;
      ok = 1;
    }
    //cout<<monk<<"\n";
    if (ok==0) sol[monkey] = 0;
    else
    sol[monkey] = sol[monk] + 1;
}

void bfs(){
  q.push(root);
  while (!q.empty()){
    int monkey = q.front();
    q.pop();
    find_level(monkey);
    for (int i = 0; i<son[monkey].size();++i)
      q.push(son[monkey][i]);
  }
}

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();
  bfs();
  put_output();
}