Pagini recente » Istoria paginii runda/itmarathon/clasament | Cod sursa (job #1535045) | Cod sursa (job #1373076) | Cod sursa (job #1533981) | Cod sursa (job #830746)
Cod sursa(job #830746)
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int val,ce,a1,b1,l,n,i,p[100007],t[100007],k[100007],tk[100007],d[100007];
vector < int > v[100007];
queue < int > cc;
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&k[i]);
for(i=1;i<n;i++)
{
scanf("%d",&a1);
scanf("%d",&b1);
t[b1]=a1;
v[a1].push_back(b1);
}
for(i=1;i<=n;i++)
if(t[i]==0) break;
p[1]=i;
l=1;
while(1)
{
if(v[p[l]].empty())
{
l--;
if(l==0) break;
}
else
{
l++;
p[l]=v[p[l-1]][0];
v[p[l-1]].erase(v[p[l-1]].begin());
tk[p[l]]=p[l-k[p[l]]];
}
}
tk[p[1]]=p[1];
for(i=1;i<=n;i++)
v[tk[i]].push_back(i);
for(i=1;i<=n;i++)
if(k[i]==0)
{
cc.push(i);
d[i]=1;
while(!cc.empty())
{
val=cc.front();
for(ce=0;ce<v[val].size();ce++)
if(d[v[val][ce]]==0)
{
d[v[val][ce]]=d[val]+1;
cc.push(v[val][ce]);
}
cc.pop();
}
}
for(i=1;i<=n;i++)
printf("%d ",d[i]-1);
return 0;
}