Pagini recente » Cod sursa (job #2380465) | Cod sursa (job #1249390) | Cod sursa (job #1074235) | Cod sursa (job #1903867) | Cod sursa (job #43237)
Cod sursa(job #43237)
#include <stdio.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[256],hash[NMAX],V[NMAX],b[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)
{
long int i;
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];
for (st=0;st<=256;st++)
val[st]=0;
while (p)
{
if (p->nod!=TT[nod]) val[V[p->nod]]=1;
p=p->urm;
}
st=0;
for (i=1;i<=255;i++)
while (val[i]) {val[i]--;b[++st]=i;}
while (sa>s) {sa-=b[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;
}