Pagini recente » Cod sursa (job #820856) | Cod sursa (job #584803) | Cod sursa (job #2440302) | Cod sursa (job #1730265) | Cod sursa (job #406548)
Cod sursa(job #406548)
#include<fstream>
#include<vector>
using namespace std;
#define nmax 100005
#define pb push_back
vector<int> g[nmax];
int k[nmax],sol[nmax],c[nmax],viz[nmax],t[nmax];
int n;
void citire ()
{
ifstream fin("cerere.in");
fin>>n;
int i,a,b;
for(i=1;i<=n;i++)
fin>>k[i];
for(i=1;i<n;i++)
{
fin>>a>>b;
g[a].pb(b);
t[b]=a;
}
fin.close ();
}
void bfs (int nod)
{
int i,inc,sf,x,q,poz;
c[inc=sf=0]=nod;
viz[nod]=1;
while(inc<=sf)
{
x=c[inc];
if(k[x]!=0)
{
q=x;
poz=k[x];
while(poz!=0)
{
q=t[q];
poz--;
}
sol[x]=sol[q]+1;
}
else
sol[x]=0;
inc++;
for(i=0;i<g[x].size();i++)
if(viz[g[x][i]]!=1)
viz[g[x][i]]=1,c[++sf]=g[x][i];
}
}
void dfs(int nod)
{
int i,poz,q;
if(k[nod]!=0)
{
q=nod;
poz=k[nod];
while(poz!=0)
{
q=t[q];
poz--;
}
sol[nod]=sol[q]+1;
}
else
sol[nod]=0;
viz[nod]=1;
for(i=0;i<g[nod].size();i++)
if(viz[g[nod][i]]!=1)
dfs(g[nod][i]);
}
void scrie()
{
int i;
ofstream fout("cerere.out");
for(i=1;i<=n;i++)
fout<<sol[i]<<' ';
fout.close();
}
int main ()
{
citire ();
int i;
for(i=1;i<=n;i++)
if(viz[i]!=1)
dfs(i);
scrie();
return 0;
}