Pagini recente » Cod sursa (job #1393937) | Cod sursa (job #2790699) | Cod sursa (job #849296) | Cod sursa (job #65710) | Cod sursa (job #44677)
Cod sursa(job #44677)
#include <cstdio>
#include <algorithm>
using namespace std;
const char iname[] = "mese.in";
const char oname[] = "mese.out";
#define MAX_N 131072
int * adj[MAX_N];
int deg[MAX_N];
int P[MAX_N], V[MAX_N], n, s;
int S[MAX_N];
int sef;
void read_in(void) {
scanf("%d", & n);
scanf("%d", & s);
for (int i = 1; i <= n; ++ i)
scanf("%d %d", P + i, V + i), deg[P[i]] ++;
}
void graph(void) {
for (int i = 0; i <= n; ++ i)
adj[i] = new int[deg[i]], deg[i] = 0;
for (int i = 1; i <= n; ++ i)
adj[P[i]][deg[P[i]] ++] = i;
for (int i = 1; i <= n; ++ i)
if (P[i] == 0) sef = i;
}
int level;
void sums(const int ang) {
S[ang] = V[ang];
for (int i = 0; i < deg[ang]; ++ i)
sums(adj[ang][i]),
S[ang] += S[adj[ang][i]];
}
int cmp(int z, int w) { return S[z] > S[w]; }
int Res = 1;
void work(const int ang) {
if (S[ang] > s) {
int sum = 0;
for (int i = 0; i < deg[ang]; ++ i) {
sum = sum + S[adj[ang][i]];
Res ++;
work(adj[ang][i]);
if (S[ang] - sum <= s)
break ;
}
}
}
int main(void)
{
freopen(iname, "r", stdin);
read_in();
graph();
sums(sef);
for (int i = 1; i <= n; ++ i)
sort(adj[i], adj[i] + deg[i], cmp);
work(sef);
freopen(oname, "w", stdout), printf("%d\n", Res);
return 0;
}