Pagini recente » Cod sursa (job #2652758) | Cod sursa (job #2946055) | Borderou de evaluare (job #161010) | Cod sursa (job #1197821) | Cod sursa (job #327696)
Cod sursa(job #327696)
#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);
}