Pagini recente » Cod sursa (job #416369) | Cod sursa (job #1288526) | Cod sursa (job #2881563) | Cod sursa (job #685660) | Cod sursa (job #217106)
Cod sursa(job #217106)
#include <fstream>
#include <sstream>
#define NMAX 100001
#define MAX_BUF_SIZE 1300000
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
int N,kth[NMAX], * A[NMAX], num[NMAX], stack[NMAX], K = -1, root;
char buf[MAX_BUF_SIZE];
void read_data()
{
f>>N;
for(int i = 1; i <= N; ++i)
f>>kth[i];
f.read(buf,MAX_BUF_SIZE);
int deg[NMAX],notr[NMAX];
stringstream str (buf);
int u,v;
for(int i = 0; i < N - 1; ++i)
{
str>>u>>v;
deg[u]++;
}
for(int i = 1; i <= N; ++i)
A[i] = new int[ deg[i] ], A[i][0] = 0;
str.seekg(0,ios::beg);
for(int i = 0; i < N - 1; ++i)
{
str>>u>>v; notr[v] = 1;
A[u][ ++A[u][0] ] = v;
}
for(int i = 1; i <= N; ++i)
{
if(!notr[i]) { root = i; break; }
}
}
void dfs(int node)
{
stack[++K] = node;
if( kth[node] )
num[node] = num[ stack[K - kth[node]] ] + 1;
for(int i = 1; i <= A[node][0]; ++i)
dfs(A[node][i]);
--K;
}
void write_sol()
{
for(int i = 1; i <= N; ++i)
g<<num[i]<<' ';
}
int main()
{
read_data();
dfs(root);
write_sol();
}