Pagini recente » Cod sursa (job #2178142) | Cod sursa (job #2356630) | Cod sursa (job #1971151) | Cod sursa (job #1851521) | Cod sursa (job #2073877)
#include <fstream>
#include <vector>
#include <bitset>
#define nmax 100002
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int pas[nmax];
int sol[nmax];
vector <int> graf[nmax];
bitset <nmax> viz;
int v2[nmax];
int v[nmax];
int z[nmax];
int pp[nmax];
int contor=0,vf=0;
void dfs()
{
int nod=v[vf];
v2[++contor]=nod;
if(pas[nod])
{
pp[nod]=v[vf-pas[nod]];
}
for(int i=0;i<graf[nod].size();i++)
{
v[++vf]=graf[nod][i];
dfs();
}
vf--;
}
int main()
{
int n,x,y;
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>pas[i];
}
for(int i=1;i<n;i++)
{
fin>>x>>y;
graf[x].push_back(y);
viz[y]=1;
}
int radacina=0;
for(int i=1;i<=n;i++)
{
if(!viz[i]){
radacina=i;
break;
}
}
v[vf]=radacina;
dfs();
for(int i=1;i<=n;i++)
{
if(pas[v2[i]]==0)
z[v2[i]]=0;
else
z[v2[i]]=1+z[pp[v2[i]]];
}
for(int i=1;i<=n;i++)
{
fout<<z[i]<<" ";
}
return 0;
}