Pagini recente » Cod sursa (job #2156177) | Cod sursa (job #194342) | Cod sursa (job #2522100) | Cod sursa (job #2882588) | Cod sursa (job #607379)
Cod sursa(job #607379)
#include <stdio.h>
#define Nmax 100001
int k[Nmax], // stramos de intrebat
nrt[Nmax], // numar de tati al nodului i
sol[Nmax], // nr de drumuri pt fiecare
cur[Nmax]; // nodul corespunzator nivelului i , din parcurgerea curenta in adancime a arborelui
int N;
int rad;
void dfs(int nod,int nivel);
struct fiu{
int nrfiu;
fiu* prev;
}fii[Nmax];
int main(int argc, char* argv[])
{
int i;
int t,f;
fiu* aux;
FILE *fpr,*fpw;
fpr = fopen("cerere.in","r");
fpw = fopen("cerere.out","w");
fscanf(fpr,"%d",&N);
for(i=1;i<=N;i++)
fscanf(fpr,"%d",&k[i]);
for(i=1;i<N;i++){
fscanf(fpr,"%d %d",&t,&f);
aux = new fiu;
aux->nrfiu = f;
aux->prev = fii[t].prev;
fii[t].prev = aux;
nrt[f]++;
}
for(i=1;i<=N;i++)
if(nrt[i] == 0){
rad = i;
break;
}
dfs(rad,1);
for(i=1;i<=N;i++)
fprintf(fpw,"%d ",sol[i]);
fclose(fpr);
fclose(fpw);
return 0;
}
void dfs(int nod,int nivel)
{
cur[nivel] = nod;
if(k[nod] != 0 )
sol[nod] = sol[cur[nivel-k[nod]]]+1 ; // daca nu este intelept
// se adauga 1 la solutia obtinuta pentru al k[nod]-ulea stramos
fiu* aux = fii[nod].prev;
while(aux != NULL){
dfs(aux->nrfiu,nivel+1);
aux = aux->prev;
}
}