Pagini recente » Cod sursa (job #1605484) | Cod sursa (job #912882) | Cod sursa (job #1734883) | Cod sursa (job #64545)
Cod sursa(job #64545)
#include<cstdio>
#include<vector>
#include<algorithm>
#define NMAX 100010
#define node A[i][j]
using namespace std;
vector<int> A[NMAX], T;
int N, S, Sum[NMAX], rad, F[NMAX], NrCut, V[NMAX];
int read()
{
int i, j, t;
freopen("mese.in", "r", stdin);
scanf("%d %d", &N, &S);
for (i = 1; i <= N; i++)
{
scanf("%d %d", &t, &Sum[i]);
V[i] = Sum[i];
if (t>0) A[t].push_back(i);
else rad = i;
}
F[rad] = 1;
}
void getsum(int i)
{
int j, n = A[i].size();
for (j = 0; j < n; j++)
if (!F[ A[i][j] ])
{
F[ A[i][j] ] = 1;
getsum(A[i][j]);
Sum[i] += Sum[ A[i][j] ];
}
}
void cut(int i)
{
int j, n = A[i].size(), total;
if (n == 0) return;
for (j = 0; j < n; j++)
if (!F[ A[i][j] ])
{
F[ A[i][j] ] = 1;
cut(A[i][j]);
}
T.clear();
for (j = total = 0; j < n; j++)
total += Sum[ A[i][j] ], T.push_back(Sum[ A[i][j] ]);
total += V[i];
sort(T.begin(), T.end());
while (total > S)
{
NrCut++;
total -= T[--n];
}
Sum[i]= total;
}
void write()
{
freopen("mese.out", "w", stdout);
printf("%d\n", 1+NrCut);
}
int main()
{
read();
getsum(rad);
memset(F,0,sizeof(F)); F[rad] = 1;
cut(rad);
write();
return 0;
}