Cod sursa(job #141519)
Utilizator | Data | 23 februarie 2008 12:43:34 | |
---|---|---|---|
Problema | Cerere | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.25 kb |
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX_N 100005
#define FIN "cerere.in"
#define FOUT "cerere.out"
int N, i;
int A[MAX_N];
int B[MAX_N];
int C[MAX_N];
int S[MAX_N];
vector<int> G[MAX_N];
int TQ;
void readdata ()
{
int x,ind,i = -1;
char sir[600000];
gets(sir);
x = ind = 0;
int L = strlen(sir);
for (ind = 0; ind <= L; ++ind)
{
if (sir[ind] >= '0' && sir[ind] <= '9')
x = x * 10 + (sir[ind] - '0');
if (sir[ind]==' ' || sir[ind]== '\n' || ind == L)
{
A[++i] = x;
x = 0;
}
}
}
void solve ()
{
int i;
int a, b, Q;
for(i = 0; i < N - 1; ++i)
{
scanf("%d %d", &a, &b);
--a; --b; ++B[b];
G[a].push_back(b);
}
for(i = 0; i < N; ++i)
if(!B[i])
{
Q = i;
break;
}
for(S[TQ++] = Q; TQ; )
{
a = S[TQ - 1];
if (!C[a])
{
C[a] = C[S[TQ - A[a] - 1]] + 1; A[a] = 0;
}
else
if(A[a] < G[a].size())
S[TQ++] = G[a][A[a]++];
else --TQ;
}
for(i = 0; i < N; ++i)
printf("%d ", C[i] - 1);
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d\n", &N);
readdata ();
solve ();
return 0;
}