Pagini recente » Cod sursa (job #3244041) | Cod sursa (job #1514365) | Cod sursa (job #812081)
Cod sursa(job #812081)
#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],rad[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
rad[b]=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();
for(i=1;i<=n;i++)
if(rad[i]==0)
{
dfs(i,1);
break;
}
for(i=1;i<=n;i++)
if(viz[i]==0)
rasp(i);
for(i=1;i<=n;i++)
g<<r[i]<<' ';
return 0;
}