Cod sursa(job #844823)

Utilizator stoicatheoFlirk Navok stoicatheo Data 29 decembrie 2012 20:51:12
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
int pp,val,ce,a1,b1,l,n,i,p[100007],t[100007],k[100007],tk[100007],d[100007];
char str[7000009];
vector < int > v[100007];
queue < int > cc;
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d\n",&n);
gets(str+1);
pp=1;
for(i=1;i<=n;i++)
{
    while(str[pp]>='0'&&str[pp]<='9')
    {
        k[i]=k[i]*10+str[pp]-48;
        pp++;
    }
    pp++;
}
for(i=1;i<n;i++)
{
    gets(str+1);
    l=strlen(str+1);
    pp=1;
    a1=0;
    while(str[pp]!=' ')
    {
        a1=a1*10+str[pp]-48;
        pp++;
    }
    pp++;
    b1=0;
    while(pp<=l)
    {
        b1=b1*10+str[pp]-48;
        pp++;
    }
    t[b1]=a1;
    v[a1].push_back(b1);
}
i=1;
while(t[i]!=0) i=t[i];
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;
}