Cod sursa(job #50893)

Utilizator filipbFilip Cristian Buruiana filipb Data 9 aprilie 2007 12:29:27
Problema Mese Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <set>
#define mp make_pair
#define f first
#define s second
#define NMax 100005

using namespace std;

int N, S, U[NMax], deg[NMax], C[NMax], rad = 0, bst = 1;
set< pair<int, int> > A;

int main()
{
    int i, nod, cost;
    set< pair<int, int> >::iterator it;

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

    scanf("%d %d", &N, &S);
    for (i = 1; i <= N; i++)
    {
        scanf("%d %d", &U[i], &C[i]);
        if (!U[i]) rad = i;
        deg[i]++; deg[U[i]]++;
    }

    for (i = 1; i <= N; i++)
        if (deg[i] == 1 && i != rad)
            A.insert( mp(C[i], i) );

    deg[0] = 0; deg[rad]--;
    for (i = 1; i < N; i++)
    {
        it = (A.begin());
        cost = it->f; nod = it->s;
        
        if (cost + C[U[nod]] <= S)
            C[U[nod]] += cost;
        else
            bst++;

        deg[U[nod]]--;
        A.erase(it);
        if (deg[U[nod]] == 1 && U[nod] != rad)
            A.insert( mp(C[U[nod]], U[nod]) );

    }

    printf("%d\n", bst);
    
    return 0;
}