Cod sursa(job #1131777)

Utilizator informatician28Andrei Dinu informatician28 Data 1 martie 2014 14:25:58
Problema Cerere Scor 0
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.21 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#define N 100001

using namespace std;


vector <int>Arb[N];
int tata[N], vaz[N];

void dfs (int nod)
{
    int i;
    for (i = 0; i < Arb[nod].size(); i++)
    {
        if (!vaz[Arb[nod][i]]){
            vaz[Arb[nod][i]] = 1;
            tata[Arb[nod][i]] = nod;
            dfs(Arb[nod][i]);
        }
    }
}

int f(int nod, int nriteratii, int versor)
{
    if ( nriteratii == versor ){
        return nod;
    } else {
        f(tata[nod], nriteratii, versor+1);
    }
}
int main()
{
    freopen("cerere.in", "r", stdin);
    freopen("cerere.out", "w", stdout);
    int nr, i, j, salturi[N];
    int x,y,nrpasi,aux;
    scanf("%d", &nr);
    for (i = 1; i <= nr; i++)
    {
        scanf ("%d", &salturi[i]);
    }
    for (i = 1; i <= nr; i++)
    {
        scanf ("%d%d", &x, &y);
        Arb[x].push_back(y);
        Arb[y].push_back(x);
    }
    vaz[1]=1;
    dfs(1);

    for (i = 1; i <= nr; i++)
    {
        nrpasi=0;
        aux = f (i, salturi[i], 0);
        if (salturi[i])
            nrpasi++;
        while ( salturi[aux] )
        {
            aux=f (aux,salturi[aux],0);
            nrpasi++;
        }
        printf("%d ", nrpasi);
    }

    return 0;
}