Cod sursa(job #854445)

Utilizator stanescumalinStanescu Malin Octavian stanescumalin Data 13 ianuarie 2013 16:54:25
Problema Cerere Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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 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++) parcurge(maim[nr].copii[i]);
	return 0;
}
int main()
{
	int a, b, i;
	ifstream fin("cerere.in");
	ofstream fout("cerere.out");
	fin>>n;
	s = new int[n+4];
	rez = new int[n+4];
	maim = new nod[n+4];
	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+1; 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;
	}
	for(i=1; i<n+1; i++)
	{
		if(maim[i].tata == 0)
		{
			parcurge(i);
		}
	}
	for(i=1; i<=n; i++) fout<<rez[i]<<" ";
	return 0;
}