Cod sursa(job #43227)

Utilizator devilkindSavin Tiberiu devilkind Data 29 martie 2007 22:00:28
Problema Mese Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 100001

FILE *f = fopen("mese.in","rt"), *g = fopen("mese.out","wt");

struct lista{long int nod;
             lista *urm;} *vf[NMAX];     

long int a[NMAX],i,j,k,n,s,r,nr,val[NMAX],hash[NMAX],V[NMAX];
long int TT[NMAX];

void citire()
{
fscanf(f,"%ld %ld",&n,&s);
lista *p;
for (i=1;i<=n;i++)
    {
    fscanf(f,"%ld %ld",&k,&a[i]);
    TT[i]=k;

    p=new lista;
    p->nod=i;
    p->urm=vf[k];
    vf[k]=p;
    
    p=new lista;
    p->nod=k;
    p->urm=vf[i];
    vf[i]=p;
    }    
}

int cmp(const void *x, const void *y)
{
return * (long int *) x - * (long int *) y;
}

long int DF(long int nod)
{
hash[nod]=1;
long int sa=a[nod],sp,st;
lista *p;
p=vf[nod];
st=0;
while (p)
      {
      if (!(hash[p->nod])) {sp=DF(p->nod);
                           sa+=sp;
			   }
      p=p->urm;
      }
p=vf[nod];
while (p)
      {
      if (p->nod!=TT[nod]) val[++st]=V[p->nod];
      p=p->urm;
      }


qsort(val,st+1,sizeof(long int),cmp);
while (sa>s) {sa-=val[st];st--;nr++;}
V[nod]=sa;
return sa;     
}

void solve()
{
nr=1;
DF(0);
fprintf(g,"%ld",nr);
}

int main()
{
citire();   
solve(); 
fclose(f);
fclose(g);
return 0;
}