Pagini recente » Cod sursa (job #2784363) | Cod sursa (job #2041763) | Cod sursa (job #2944697) | Cod sursa (job #2580241) | Cod sursa (job #1902223)
#include <fstream>
#include <vector>
#define nmax 100000
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
int n, niv[nmax],viz[nmax], m, sol[nmax], k[nmax], l, sap;
vector<int>v[nmax];
void dfs(int x)
{ int i;
viz[x]=1;
for(i=0;i<v[x].size();i++)
if(viz[v[x][i]]!=1)
{
viz[v[x][i]]=1;
niv[v[x][i]]=niv[x]+1;
dfs(v[x][i]);
}
}
void dfs1(int x)
{ int i;
viz[x]=1;
if(niv[x]==sap && k[x]==0)
{fill(viz+1,viz+nmax,1);
l++;}
else if(niv[x]==sap && k[x]!=0)
{ sap=sap-k[sap];
l++;
}
for(i=0;i<v[x].size();i++)
if(viz[v[x][i]]!=1)
{
viz[v[x][i]]=1;
dfs1(v[x][i]);
}
}
int main()
{
int x, y, i, j, ok;
f>>n;
for(i=1;i<=n;i++)
f>>k[i];
for(i=1;i<n;i++)
{ f>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
niv[1]=1;
dfs(1);
fill(viz+1,viz+nmax+1,0);
for(i=1;i<=n;i++)
{
if(k[i]==0)
sol[i]==0;
else
{ l=0;
sap=niv[i]-k[i];
dfs1(i);
fill(viz+1,viz+nmax+1,0);
sol[i]=l;
}
}
for(i=1;i<=n;i++)
g<<sol[i]<<' ';
}