Pagini recente » Cod sursa (job #734678) | Cod sursa (job #1925283) | Cod sursa (job #1017112) | Cod sursa (job #722837) | Cod sursa (job #103793)
Cod sursa(job #103793)
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NMAX 100002
using namespace std;
typedef struct _nod{long n; long v; long t;} nod;
long *A[NMAX];
nod V[NMAX];
long q[NMAX];
long n, rad;
int s;
int ss[NMAX];
long sol;
inline int cmp(int a, int b)
{
return a>b;
}
void solve(long r)
{
long i;
if (V[r].v>s)
{
memset(ss,0,sizeof(ss));
for (i=1; i<=A[r][0]; ++i)
ss[i]=V[A[r][i]].v;
sort(ss+1,ss+A[r][0],cmp);
for (i=1; i<=A[r][0] && V[r].v>s; ++i)
{
V[r].v-=ss[i];
++sol;
}
}
V[V[r].t].v+=V[r].v;
}
int main()
{
freopen("mese.in","r",stdin);
freopen("mese.out","w",stdout);
long i, j;
long x, y;
scanf("%ld %d", &n, &s);
for (i=1; i<=n; ++i)
{
A[i]=(long *)realloc(A[i], sizeof(long));
A[i][0]=0;
}
for (i=1; i<=n; ++i)
{
scanf("%ld %ld", &x, &y);
if (x==0) {rad=i;V[i].v=y;}
else
{
V[i].n=i;
V[i].v=y;
V[i].t=x;
++A[x][0];
A[x]=(long *)realloc(A[x], (A[x][0]+1)*sizeof(long));
A[x][A[x][0]]=i;
}
}
long lo, hi;
lo=hi=1;
q[lo]=rad;
while (lo<=hi)
{
for (i=1; i<=A[q[lo]][0]; ++i)
q[++hi]=A[q[lo]][i];
++lo;
}
for (i=n; i>=1; --i) solve(q[i]);
printf("%ld", sol+1);
fclose(stdin);
fclose(stdout);
return 0;
}