Cod sursa(job #986542)

Utilizator cbanu96Banu Cristian cbanu96 Data 19 august 2013 01:07:16
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
//#include <cstdio>
//#include <vector>
//#include <stack>
//
//#define FILEIN "cerere.in"
//#define FILEOUT "cerere.out"
//
//using namespace std;
//
//const int NMAX = 100005;
//
//int N;
//int K[NMAX];
//int G[NMAX];
//vector<int> F[NMAX], P[NMAX];
//int st[NMAX];
//int top;
//
//void dfs(int node) {
//    top++;
//    st[top] = node;
//    if (K[node] != 0) {
//        G[node] = G[st[top-K[node]]] + 1;
//    }
//    size_t i;
//    for ( i = 0; i < F[node].size(); i++ ) {
//        dfs(F[node][i]);
//    }
//    top--;
//}
//
//int main()
//{
//    top = 0;
//    int i, x, y;
//    freopen(FILEIN, "r", stdin);
//    freopen(FILEOUT, "w", stdout);
//
//    scanf("%d", &N);
//    for ( i = 1; i <= N; i++) {
//        scanf("%d", &K[i]);
//    }
//    for ( i = 1; i < N; i++) {
//        scanf("%d %d", &x, &y);
//        F[x].push_back(y);
//        P[y].push_back(x);
//    }
//
//    for ( i = 1; i <= N; i++) {
//        if (P[i].size() == 0) {
//            dfs(i);
//            break;
//        }
//    }
//
///*    for ( i = 1; i <= N; i++ ) {
//        if (K[i] == 0) {
//            dfs2(i, 0);
//        }
//    }*/
//
//    for ( i = 1; i <= N; i++ ) {
//        printf("%d ", G[i]);
//    }
//    printf("\n");
//
//
//    return 0;
//}

#include <fstream>
#include <iostream>
#include <vector>

#define FILEIN "cerere.in"
#define FILEOUT "cerere.out"

using namespace std;

const int NMAX = 100005;

int N;
int K[NMAX];
int G[NMAX];
vector<int> F[NMAX], P[NMAX];
int st[NMAX];
int top;

void dfs(int node) {
    top++;
    st[top] = node;
    if (K[node] != 0) {
        G[node] = G[st[top-K[node]]] + 1;
    }
    size_t i;
    for ( i = 0; i < F[node].size(); i++ ) {
        dfs(F[node][i]);
    }
    top--;
}

int main()
{
    top = 0;
    int i, x, y;
    ifstream f(FILEIN);
    ofstream g(FILEOUT);

    f >> N;
    for ( i = 1; i <= N; i++) {
        f >> K[i];
    }
    for ( i = 1; i < N; i++) {
        f >> x >> y;
        F[x].push_back(y);
        P[y].push_back(x);
    }

    for ( i = 1; i <= N; i++) {
        if (P[i].size() == 0) {
            dfs(i);
            break;
        }
    }

/*    for ( i = 1; i <= N; i++ ) {
        if (K[i] == 0) {
            dfs2(i, 0);
        }
    }*/

    for ( i = 1; i <= N; i++ ) {
        g << G[i] << ' ';
    }
    g << '\n';


    return 0;
}