Pagini recente » Cod sursa (job #367389) | Cod sursa (job #709420) | Cod sursa (job #2946186) | Cod sursa (job #968422) | Cod sursa (job #1053788)
#include <fstream>
#include <vector>
#define In "cerere.in"
#define Out "cerere.out"
#define Nmax 100010
using namespace std;
vector<int>arb[Nmax];
int n, R,grad[Nmax], sol[Nmax], nr[Nmax];
int St[Nmax],top;
inline void Citire()
{
ifstream f(In);
f>>n;
int i,x,y;
for(i=1;i<=n;i++)
f>>nr[i];
for(i=1;i<n;i++)
{
f>>x>>y;
arb[x].push_back(y);
grad[y]++;
}
f.close();
}
inline void Cauta_Radacina()
{
for(int i = 1;i <= n && R==0 ;i++)
if(grad[i]==0)
R = i;
}
inline void Dfs(int nod)
{
St[++top] = nod;
if(nr[nod]!=0)
sol[nod] = sol[St[top-nr[nod]]]+1;
//top-nr[nod] este indicele stramosului de care avem nevoie
//pentru ai putea raspunde lui nod la intrebare
for(vector<int>::iterator it=arb[nod].begin();it!=arb[nod].end();it++)
Dfs(*it);
top--;
}
inline void Afisare()
{
ofstream g(Out);
for(int i=1;i<=n;i++)
g<<sol[i]<<" ";
g<<"\n";
g.close();
}
int main()
{
Citire();
Cauta_Radacina();
Dfs(R);
Afisare();
return 0;
}