Pagini recente » Cod sursa (job #413720) | Cod sursa (job #153369) | Cod sursa (job #1020839) | Cod sursa (job #107551) | Cod sursa (job #45872)
Cod sursa(job #45872)
#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<short, int> bst[MAX_N];
vector<int> G[MAX_N];
void DFS(int n)
{
vector<int>::iterator it;
for (it = G[n].begin(); it != G[n].end(); it++)
{
DFS(*it);
bst[n].s += bst[*it].s;
*it = bst[*it].f;
}
sort(G[n].begin(), G[n].end());
for (it = G[n].begin(); it != G[n].end(); it++)
{
if ((int)bst[n].f+*it > S) break;
bst[n].f += *it; bst[n].s--;
}
}
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(c, 1);
if (!up[i]) 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].s);
return 0;
}