Pagini recente » Cod sursa (job #1818008) | Cod sursa (job #2926084) | Cod sursa (job #1584419) | Cod sursa (job #922769) | Cod sursa (job #45848)
Cod sursa(job #45848)
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
#define MAX_N 100005
#define FIN "mese.in"
#define FOUT "mese.out"
#define f first
#define s second
#define pb push_back
#define mp make_pair
int N, S, up[MAX_N], deg[MAX_N];
pair<int, short> bst[MAX_N];
vector<int> G[MAX_N];
vector<short>::iterator it2;
void DFS(int n)
{
vector<int>::iterator it;
vector<short> V;
for (it = G[n].begin(); it != G[n].end(); it++)
{
DFS(*it);
bst[n].f += bst[*it].f;
}
for (it = G[n].begin(); it != G[n].end(); it++)
V.pb(bst[*it].s);
sort(V.begin(), V.end());
for (it2 = V.begin(); it2 != V.end(); it2++)
{
if (bst[n].s+*it2 > S) break;
bst[n].s += *it2; bst[n].f--;
}
}
int main(void)
{
int i, c, root = 0;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d %d", &N, &S);
for (i = 1; i <= N; i++)
{
scanf("%d %d", up+i, &c);
deg[up[i]]++;
bst[i] = mp(1, c);
if (!up) root = i;
}
for (i = 1; i <= N; i++)
G[i].reserve(deg[i]);
for (i = 1; i <= N; i++)
if (up[i]) G[up[i]].pb(i);
DFS(root);
printf("%d\n", bst[root].f);
return 0;
}