Pagini recente » Cod sursa (job #359903) | Cod sursa (job #1689777) | Cod sursa (job #549400) | Cod sursa (job #669713) | Cod sursa (job #164599)
Cod sursa(job #164599)
#include<stdio.h>
#define INPUT "cerere.in"
#define OUTPUT "cerere.out"
#define NMAX 100001
FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");
typedef struct lista
{
long nod;
struct lista *next;
};
lista *p[ NMAX ];
long stramos[ NMAX ], final[ NMAX ], N, radacina, stiva[ NMAX ];
bool util[ NMAX ];
void readValues();
void solveFunction();
void DF();
void printSolution();
int main()
{
readValues();
solveFunction();
fclose(fin);
fclose(fout);
return 0;
}
void readValues()
{
lista *adr;
long val1, val2;
fscanf(fin, "%ld", &N);
for(long i = 0; i < N; ++i)
fscanf(fin, "%ld", &stramos[ i ]);
for(long i = 0; i < N - 1; ++i)
{
fscanf(fin, "%ld %ld", &val1, &val2);
adr = new lista;
adr -> nod = val2 - 1;
adr -> next = p[ val1 - 1 ];
p[ val1 - 1 ] = adr;
util[ val2 - 1 ] = 1;
}
}
void solveFunction()
{
radacina = -1;
for(long i = 0; i < N; ++i)
if(!util[ i ])
radacina = i;
DF();
printSolution();
}
void DF()
{
long pozitie, node, ancestor;
stiva[ 0 ] = radacina;
pozitie = 0;
node = radacina;
while(pozitie >= 0)
{
if(p[ node ] != NULL)
{
stiva[ ++pozitie ] = p[ node ] -> nod;
ancestor = stramos[ stiva[ pozitie ]];
if(ancestor)
final[ stiva[ pozitie ] ] = final[ stiva[pozitie - ancestor]] + 1;
else
final[ stiva[ pozitie ] ] = 0;
p[ node ] = p[ node ] -> next;
node = stiva[ pozitie ];
}
else
{
--pozitie;
node = stiva[ pozitie ];
}
}
}
void printSolution()
{
for(long i = 0; i < N ; ++i)
fprintf(fout, "%ld ", final[ i ]);
fprintf(fout, "\n");
}