Pagini recente » Cod sursa (job #1452377) | Cod sursa (job #2250727) | Cod sursa (job #1819480) | Cod sursa (job #447512) | Cod sursa (job #1007996)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <fstream>
#define pb push_back
#define Lim 1000000
#define Next ((++pos==Lim )? f.read(Buffer,Lim) ,pos = 0: 0)
using namespace std;
const int Nmax = 100005;
ifstream f("cerere.in");
queue<int> Q;
vector<int> G[ Nmax ];
int N,daddy[ Nmax ],stra[ Nmax ],root,D[ Nmax ];
char Buffer[Lim];
int pos;
inline void Read(int &x)
{
x = 0;
for(;Buffer[pos] < '0' || Buffer[pos] > '9'; Next);
for(;Buffer[pos] >= '0' && Buffer[pos] <= '9'; Next)
x = x*10+Buffer[pos]-'0';
}
void read_data()
{
Read(N);
int i,a,b;
for(i = 1 ; i <= N; ++i)
Read(stra[ i ]);
for(i = 1 ; i < N; ++i){
Read(a);Read(b);
G[a].pb(b);
daddy[b] = a;
}
for(i = 1; i <= N; ++i)
if(!daddy[i]) {
root = i;
break;
}
}
int cauta(int k)
{
int ns;
if(stra[ k ] == 0) //dak e eminent :)
return 0;
if(D[k] != -1) // dak am calc deja
return D[k];
ns = stra[k];//la cati ne ducem in sus
for(int i = 1; i <= ns; ++i)
k = daddy[k];
return D[k] + 1;
}
void BFS(int nodc)//fiind un arbore si pronind din radacina
{ // e clar ca nu ne trebuie sa marcam nodurile ca nu se poate
Q.push(nodc); // sa le bagi de mai multe ori decat trebuie
while(!Q.empty())
{
nodc = Q.front();Q.pop();
D[ nodc ] = cauta(nodc);// formam solutia
for(vector<int>::iterator it = G[nodc].begin();it != G[nodc].end();++it)
Q.push(*it);
}
}
void solve()
{
memset(D,-1,sizeof(D));
BFS(root);
for(int i = 1; i <= N ; ++i)
printf("%d ",D[i]);
}
int main()
{
freopen("cerere.out","w",stdout);
read_data();
solve();
return 0;
}