Cod sursa(job #830746)

Utilizator geniucosOncescu Costin geniucos Data 7 decembrie 2012 17:07:45
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#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;
}