Pagini recente » Cod sursa (job #1628470) | Cod sursa (job #659837) | Cod sursa (job #2160084) | Cod sursa (job #1018342) | Cod sursa (job #271637)
Cod sursa(job #271637)
#include <cstdio>
#include <vector>
#include <algorithm>
#define maxn 100100
using namespace std;
int n, i, j, sol, s, a, b, rad;
vector <int> v[maxn];
int c[maxn], sum[maxn];
bool cmp(int a, int b) {
if (a > b)
return true;
return false;
}
void df(int nod) {
int i, fiu;
vector <int> p;
p.clear();
sum[nod] = c[nod];
for (i = 0; i < v[nod].size(); i++) {
fiu = v[nod][i];
df(fiu);
sum[nod] += sum[fiu];
p.push_back(sum[fiu]);
}
sort(p.begin(), p.end(), cmp);
for (i = 0; i < p.size() && sum[nod] > s; i++) {
sum[nod] -= p[i];
sol++;
}
}
int main() {
freopen("mese.in", "r", stdin);
freopen("mese.out", "w", stdout);
scanf("%d%d", &n, &s);
for (i = 1; i <= n; i++) {
scanf("%d%d", &a, &c[i]);
if (a)
v[a].push_back(i);
else
rad = i;
}
df(rad); //am calculat sumele pentru subarbori, si tot acolo fac si partea cu impartitu pe sub-arbori
printf("%d\n", sol + 1);
return 0;
}