Cod sursa(job #44171)

Utilizator devilkindSavin Tiberiu devilkind Data 30 martie 2007 22:17:42
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 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];

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

    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;
}

void DF(long int nod)
{
hash[nod]=2;
long int sa=a[nod],st;
lista *p;
p=vf[nod];
st=0;
while (p)
      {
      if (!(hash[p->nod])) {DF(p->nod);
                           sa=sa+V[p->nod];}
      p=p->urm;
      }
      
p=vf[nod];
st=0;
while (p)
      {
      if (hash[p->nod]!=2) 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;  
hash[nod]=1;  
}

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

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