Pagini recente » Cod sursa (job #997192) | Cod sursa (job #1964703) | Cod sursa (job #654153) | Cod sursa (job #2348475) | Cod sursa (job #43227)
Cod sursa(job #43227)
#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;
}