Pagini recente » Cod sursa (job #3229623) | Cod sursa (job #2799716) | Cod sursa (job #248256) | Cod sursa (job #3262028) | Cod sursa (job #44171)
Cod sursa(job #44171)
#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;
}