Cod sursa(job #63508)

Utilizator alextheroTandrau Alexandru alexthero Data 28 mai 2007 23:16:47
Problema Mese Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

#define pb push_back
#define nmax 100005
#define smax 30005

using namespace std;

vector <int> e[nmax],pp;
int v[nmax],dad[nmax],s1[nmax],n,sol = 1,s,tata[nmax],scos[nmax],age[nmax],sef;

void dfs(int x) {
	v[x] = 1;
	s1[x] = age[x];
	for(int i = 0; i < (int)e[x].size(); i++)
		if(!v[e[x][i]]) {
			dad[e[x][i]] = x;
			dfs(e[x][i]);
			s1[x] += s1[e[x][i]];
			pp.pb(s1[e[x][i]]);
		}
	pp.clear();
	for(int i = 0; i < (int)e[x].size(); i++)
		if(dad[e[x][i]] == x) pp.pb(s1[e[x][i]]);
	if(s1[x] > s) {
		sort(pp.begin(),pp.end());
		while(s1[x] > s) {
			s1[x] -= pp[pp.size() - 1];
			sol++;
			pp.pop_back();
		}
		
	}
}

int main() {
	freopen("mese.in","r",stdin);
	freopen("mese.out","w",stdout);

	scanf("%d%d",&n,&s);
	for(int i = 1; i <= n; i++) {
		scanf("%d%d",&tata[i],&age[i]);
		if(tata[i] != 0) {
			e[tata[i]].pb(i);
			e[i].pb(tata[i]);
		}
		else sef = i;
	}

	dfs(1);
	printf("%d\n",sol);

	return 0;
}