Cod sursa(job #45872)

Utilizator dominoMircea Pasoi domino Data 1 aprilie 2007 23:54:59
Problema Mese Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

#define MAX_N 100005
#define FIN "mese.in"
#define FOUT "mese.out"
#define f first
#define s second
#define pb push_back
#define mp make_pair

int N, S, up[MAX_N], deg[MAX_N]; 
pair<short, int> bst[MAX_N];
vector<int> G[MAX_N];

void DFS(int n)
{
    vector<int>::iterator it;

    for (it = G[n].begin(); it != G[n].end(); it++)
    {
        DFS(*it);
        bst[n].s += bst[*it].s;
        *it = bst[*it].f;
    }
    sort(G[n].begin(), G[n].end());
    for (it = G[n].begin(); it != G[n].end(); it++)
    {
        if ((int)bst[n].f+*it > S) break;
        bst[n].f += *it; bst[n].s--;
    }
}

int main(void)
{
    int i, c, root = 0;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d", &N, &S);
    for (i = 1; i <= N; i++)
    {
        scanf("%d %d", up+i, &c);
        deg[up[i]]++;
        bst[i] = mp(c, 1);
        if (!up[i]) root = i;
    }
    for (i = 1; i <= N; i++)
        G[i].reserve(deg[i]);
    for (i = 1; i <= N; i++)
        if (up[i]) G[up[i]].pb(i);

    DFS(root);
    printf("%d\n", bst[root].s);

    return 0;
}