Cod sursa(job #44677)

Utilizator MariusMarius Stroe Marius Data 31 martie 2007 17:05:38
Problema Mese Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#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;
}