Cod sursa(job #1950007)

Utilizator Lungu007Lungu Ionut Lungu007 Data 2 aprilie 2017 16:55:15
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <iostream>
#include <vector>
#include <fstream>
#define NMAX 100005

using namespace std;

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

int n,m,c[NMAX],t[NMAX],viz[NMAX],x,y,cost,d[NMAX];
vector<int> a[NMAX];

int detStr(int nod) {
    int lim;
    lim = c[nod];
    for(int i=0;i<lim;i++) {
        nod = t[nod];
    }
    return nod;
}

void dfs(int nod) {
    viz[nod] = 1;

    for(int i=0;i<a[nod].size();i++) {
        if(!viz[a[nod][i]]){
            if(c[a[nod][i]] == 0) d[a[nod][i]] = 0;
            else d[a[nod][i]] = 1+ d[detStr(a[nod][i])];
            dfs(a[nod][i]);
        }
    }
}

int main()
{
    in >> n;
    for(int i=1;i<=n;i++) {
        in >> c[i];
    }

    for(int i=1;i<n;i++) {
        in >> x >> y;
        t[y] = x;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    int rad = 1;

    for(int i=1;i<=n;i++) {
        if(t[i] == 0) {
            rad = i;
            break;
        }
    }
    dfs(rad);

    for(int i=1;i<=n;i++) {
        //cout << t[i] << " ";
        out << d[i] << " ";
    }//
    //cout << calcStr(4);
    return 0;
}