Cod sursa(job #812046)

Utilizator marinutzacatana marina marinutza Data 13 noiembrie 2012 12:17:00
Problema Cerere Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<fstream>
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
#define nmax 100010
struct nod
{
    int nr;
    nod * adr;
} *desc[nmax];
int k[nmax],r[nmax],str[nmax],stv[nmax],n,viz[nmax];
void cit()
{
    int a,b;
    f>>n;
    for(int i=1;i<=n;i++)
		f>>k[i];
    for(int i=1;i<n;i++)
    {
        f>>a>>b;//b in lista lui a
        nod *p=new nod;
        p->nr=b;
        p->adr=desc[a];
        desc[a]=p;
    }
}
void dfs(int nd,int niv)
{
    stv[niv]=nd;
    if(k[nd]==0)
    str[nd]=0;
    else
    str[nd]=stv[niv-k[nd]];
    for(nod *p=desc[nd];p!=NULL;p=p->adr)
        dfs(p->nr,niv+1);
}
void rasp(int i)
{
    if(k[i]==0)
        r[i]=0;
    else
    {
		if(viz[str[i]]==0)
        rasp(str[i]);
        r[i]=r[str[i]]+1;
    }
	viz[i]=1;
}
int main()
{
	int i;
    cit();
    dfs(1,1);
	for(i=1;i<=n;i++)
		if(viz[i]==0)
			rasp(i);
    for(i=1;i<=n;i++)
        g<<r[i]<<' ';
    return 0;
}