Pagini recente » Cod sursa (job #2550047) | Cod sursa (job #2614296) | Cod sursa (job #2642554) | Cod sursa (job #1643097) | Cod sursa (job #607373)
Cod sursa(job #607373)
#include <stdio.h>
#define Nmax 100000
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;
}
}