Pagini recente » Cod sursa (job #1498137) | Cod sursa (job #555499) | Cod sursa (job #628077) | Cod sursa (job #667729) | Cod sursa (job #502175)
Cod sursa(job #502175)
#include<fstream>
#include<list>
#define NMAX 100003
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
list<int> a[NMAX];
int n, k[NMAX], t[NMAX], st, viz[NMAX], pp[NMAX];
struct coada
{
int nod, prec;
}c[NMAX];
void citeste()
{
int i, x, y;
f>>n;
for (i=1; i<=n; ++i) f>>k[i];
for (i=1; i<n; ++i)
{
f>>x>>y;
t[y]=x;
a[x].push_back(y);
}
for (i=1; i<=n; ++i)
if (t[i]==0) {st=i; break;}
}
void bfs()
{
int p=1, u=1, z;
list<int> :: iterator it;
c[1].nod=st;viz[st]=1;
while (p<=u)
{
z=c[p].nod;
for (it=a[z].begin(); it!=a[z].end(); ++it)
{
c[++u].nod=*it;c[u].prec=p; viz[*it]=u;
}
++p;
}
}
void precedenta()
{
int i, niv, nod, j;
for (i=1; i<=n; ++i)
{
niv=0;j=viz[i];
while (niv<k[i])
{
j=c[j].prec;
++niv;
}
pp[i]=c[j].nod;
}
}
void solve()
{
int i, j, val;
for (i=1; i<=n; ++i)
{
j=pp[i];
if (j==i) val=0;
else
{
val=1;
while (k[j]!=0)
{
j=pp[j];
++val;
}
}
g<<val<<" ";
}
}
int main()
{
citeste();
bfs();
precedenta();
solve();
f.close();
g.close();
return 0;
}