Cod sursa(job #1501409)

Utilizator GinguIonutGinguIonut GinguIonut Data 13 octombrie 2015 13:28:39
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <vector>
#include <string.h>
#define nMax 100002
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int Lev[nMax], K[nMax], a, b, Sol[nMax], i, n, root, m, nr, poz, j;
vector <int> G[nMax];
bool Deg[nMax];
char sir[800000];
void DFS(int node, int lvl)
{
    if(K[node]==0)
        Lev[lvl]=0;
    else
        Lev[lvl]=Lev[lvl-K[node]]+1;
    Sol[node]=Lev[lvl];
    for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
        DFS(*it, lvl+1);
}
int main()
{
    fin>>n;
    fin.get();
    fin.getline(sir+1, 800000);
    m=strlen(sir+1);
    for(i=1;i<=m;i++)
    {
        if(sir[i]>='0'&&sir[i]<='9')
            nr=nr*10+sir[i]-'0';
        else
        {
            K[++poz]=nr;
            nr=0;
        }
    }
    for(i=1;i<n;i++)
    {
        fin.getline(sir+1, 800000);
        m=strlen(sir+1);
        a=nr=0;
        for(j=1;j<=m;j++)
        {
            if(sir[j]>='0'&&sir[j]<='9')
                nr=nr*10+sir[j]-'0';
            else
            {
                a=nr;
                nr=0;
            }
        }
        G[a].push_back(nr);
        Deg[nr]=1;
    }
    for(i=1;i<=n;i++)
    {
        if(Deg[i]==0)
        {
            root=i;
            break;
        }
    }
    DFS(root, 1);
    for(i=1;i<=n;i++)
        fout<<Sol[i]<<" ";
    return 0;
}