Cod sursa(job #1007996)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 9 octombrie 2013 23:35:36
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <fstream>

#define pb push_back
#define Lim 1000000
#define Next ((++pos==Lim )? f.read(Buffer,Lim) ,pos = 0: 0)

using namespace std;
const int Nmax = 100005;

ifstream f("cerere.in");

queue<int> Q;
vector<int> G[ Nmax ];
int N,daddy[ Nmax ],stra[ Nmax ],root,D[ Nmax ];


char Buffer[Lim];
int pos;

inline void Read(int &x)
{
    x = 0;
    for(;Buffer[pos] < '0' || Buffer[pos] > '9'; Next);
    for(;Buffer[pos] >= '0' && Buffer[pos] <= '9'; Next)
        x = x*10+Buffer[pos]-'0';
}



void read_data()
{
    Read(N);
    int i,a,b;
    for(i = 1 ; i <= N; ++i)
            Read(stra[ i ]);

    for(i = 1 ; i < N; ++i){
        Read(a);Read(b);
        G[a].pb(b);
        daddy[b] = a;
    }
    for(i = 1; i <= N; ++i)
        if(!daddy[i]) {
            root = i;
            break;
        }
}

int cauta(int k)
{
    int ns;
    if(stra[ k ] == 0) //dak e eminent :)
        return 0;
    if(D[k] != -1) // dak am calc deja
        return D[k];
    ns = stra[k];//la cati ne ducem in sus
    for(int i = 1; i <= ns; ++i)
                        k = daddy[k];
    return D[k] + 1;
}

void BFS(int nodc)//fiind un arbore si pronind din radacina
{                   // e clar ca nu ne trebuie sa marcam nodurile ca nu se poate
    Q.push(nodc);   // sa le bagi de mai multe ori decat trebuie
    while(!Q.empty())
    {
        nodc = Q.front();Q.pop();
        D[ nodc ] = cauta(nodc);// formam solutia
        for(vector<int>::iterator it = G[nodc].begin();it != G[nodc].end();++it)
            Q.push(*it);
    }
}

void solve()
{
    memset(D,-1,sizeof(D));
    BFS(root);
    for(int i = 1; i <= N ; ++i)
        printf("%d ",D[i]);
}

int main()
{
    freopen("cerere.out","w",stdout);

    read_data();
    solve();

    return 0;
}