Pagini recente » Cod sursa (job #2069015) | Cod sursa (job #2550849) | Cod sursa (job #2393779) | Cod sursa (job #827280) | Cod sursa (job #1107961)
#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;
}