Cod sursa(job #1081867)

Utilizator maritimCristian Lambru maritim Data 13 ianuarie 2014 22:21:10
Problema Cerere Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.32 kb
#include<stdio.h>
#include<malloc.h>
 
#define MaxN 100100
 
typedef struct _nod
{
    int info;
    struct _nod *adr;
} nod;
 
typedef struct
{
    struct _nod *cap;
} list;
 
list A[MaxN];
int K[MaxN];
int sol[MaxN];
int V[MaxN];
bool viz[MaxN];
int N;
 
void add(int a,int b) // adauga in lista de adiacenta
{
    nod *nou = (nod*)malloc(sizeof(nod));
    nou->info = b;
    nou->adr = A[a].cap;
    A[a].cap = nou;
}
 
void citire(void) // citeste
{
    int a;
    int b;
    FILE *f = fopen("cerere.in","r");
     
    fscanf(f,"%d ",&N);
    for(int i=1;i<=N;i++)
        fscanf(f,"%d ",&K[i]);
    for(int i=1;i<=N-1;i++)
    {
        fscanf(f,"%d %d",&a,&b);
        add(a,b);
        viz[b] = true;
    }
     
    fclose(f);
}
 
int FindRad(void) // gaseste radacina
{
    int i;
    for(i = 1;viz[i];i++);
    return i;   
}
 
void parcurgere(int a,int k)
{
    V[k] = a;
    nod *q = A[a].cap;
    while(q)
    {
        if(K[q->info])
            sol[q->info] = sol[V[k-K[q->info]+1]] + 1; // recurenta
        parcurgere(q->info,k+1);
        q = q->adr;
    }
}
 
int main()
{
    FILE *g = fopen("cerere.out","w");
     
    citire();
    parcurgere(FindRad(),1); // se parcurge graful de pe pozitia radacinii
    for(int i=1;i<=N;i++) // afiseaza
        fprintf(g,"%d ",sol[i]); // solutiile
     
    fclose(g);
    return 0;
}