Cod sursa(job #857169)

Utilizator stanescumalinStanescu Malin Octavian stanescumalin Data 17 ianuarie 2013 15:10:05
Problema Cerere Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
 
using namespace std;
 
struct nod
{
    int tata;
    int nr;
    int* copii;
    int nr_copii;
};
 
int* s; int *m; int* rez;
int n;  nod* maim;
int q[110000]; int l;
 
int stramosk(int nr, int k)
{
    int st, i;
    st = nr;
    for(i=0; i<k; i++)
    {
        st = maim[st].tata;
    }
    return st;
}
int parcurge(int nr)
{
    int st = stramosk(nr, s[nr]);
    if(s[nr] == 0) rez[nr] = 0;
    else rez[nr] = rez[st]+1;
    int i;
	for(i=0; i<maim[nr].nr_copii; i++) {q[l] = maim[nr].copii[i]; l++; }
	//cout<<"p"<<nr;
    return 0;
} /*
void tester()
{
	ofstream fout("cerere.in");
	fout<<100000<<"\n0 ";
	int i;
	for(i=1; i<100000; i++) fout<<"1 ";
	fout<<"\n";
	for(i=1; i<100000; i++) fout<<i<<" "<<i+1<<"\n";
	fout.close();
} */
int main()
{
	//tester();
    int a, b, i, j;
    ifstream fin("cerere.in");
    ofstream fout("cerere.out");
    fin>>n;
    s = new int[110000];
    rez = new int[110000];
    maim = new nod[110000];
    for(i=1; i<n+1; i++)
    {
        maim[i].tata = 0;
        maim[i].nr = i;
        maim[i].copii = 0;
        maim[i].nr_copii = 0;
    }
    for(i=1; i<=n; i++) fin>>s[i];
    for(i=1; i<n; i++)
    {
        fin>>a; fin>>b;
        maim[a].copii = (int*)realloc(maim[a].copii, sizeof(int));
        m = maim[a].copii;
        m[maim[a].nr_copii] = b;
        maim[a].nr_copii++;
        maim[b].tata = a;
		//cout<<a<<" "<<b;
    }
    for(i=1; i<n+1; i++)
    {
        if(maim[i].tata == 0)
        {
			l = 1;
			q[0] = i;
            for(j=0; j<l; j++) parcurge(q[j]);
        }
    }
    for(i=1; i<=n; i++) fout<<rez[i]<<" ";
	//system("PAUSE");
    return 0;
}