Cod sursa(job #1107961)

Utilizator 96andreiFMI Andrei Barbu 96andrei Data 15 februarie 2014 11:53:10
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <vector>
using namespace std;

int const N=100005;

vector<int> graph[N];
vector<int> intop;
bool use[N];
int k[N];
int n,timp_in[N],timp_out[N],timp=0;

void dfs(int x)
{
    timp_in[x]=timp++;
    use[x]=true;
    vector<int>::iterator it;

    for(it=graph[x].begin(); it!=graph[x].end(); it++)
    {
        if(!use[*it])
            dfs(*it);
    }
    intop.push_back(x);
    timp_out[x]=timp++;
}

int main()
{
    ifstream fin("cerere.in");
    ofstream fout("cerere.out");
    fin>>n;
    for(int i=1; i<=n; i++)
        fin>>k[i];
    for(int i=1; i<n; i++)
    {
        int x,y;
        fin>>x>>y;
        graph[x].push_back(y);
    }

    for(int i=1; i<=n; i++)
        if(!use[i])
            dfs(i);
    for(int i=1; i<=n; i++)
    {
        int x=k[i],pas=1,j=-1;
        if(x)
        {
            do
            {
                j++;
            }while (intop[j]!=i);
            while(x)
            {
                j++;
                if(timp_in[intop[j]]<timp_in[i] && timp_out[intop[j]]>timp_out[i])
                    x--;
                if(x==0)
                {
                    if(k[intop[j]])
                    {
                        pas++;
                        x=k[intop[j]];
                    }
                }
            }
            fout<<pas<<" ";
        }
        else
            fout<<0<<" ";
    }
    return 0;
}