Cod sursa(job #327696)

Utilizator Mishu91Andrei Misarca Mishu91 Data 29 iunie 2009 20:19:26
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define MAX_N 100005

#define foreach(V) for(vector <int> ::iterator it = (V).begin(); it != (V).end(); ++it)

int N, S, R, Sol(1);
int T[MAX_N], V[MAX_N], Sum[MAX_N];

vector <int> G[MAX_N];

void citire()
{
	scanf("%d %d",&N, &S);
	
	for(int i = 1; i <= N; ++i)
	{
		scanf("%d %d",T+i, V+i);
		
		if(T[i] == 0) R = i;
		G[T[i]].push_back(i);
	}
}

struct cmp
{
	bool operator() (const int &a, const int &b)
	{
		return Sum[a] > Sum[b];
	}
};

void dfs(int nod)
{
	Sum[nod] = V[nod];
	
	foreach(G[nod])
	{
		dfs(*it);
		Sum[nod] += Sum[*it];
	}
	
	sort(G[nod].begin(), G[nod].end(), cmp());
	
	foreach(G[nod])
		if(Sum[nod] > S)
		{
			Sum[nod] -= Sum[*it];
			++Sol;
		}
}

int main()
{
	freopen("mese.in","rt",stdin);
	freopen("mese.out","wt",stdout);
	
	citire();
	dfs(R);
	printf("%d\n",Sol);
}