Cod sursa(job #50411)

Utilizator varuvasiTofan Vasile varuvasi Data 7 aprilie 2007 17:38:08
Problema Mese Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>
#define FOR(i, a, b) for (i = (a); i <= (b); i++)
#define MaxN 100001

int N, S, root, brk;
int Sf[MaxN], varsta[MaxN], sel[MaxN];

struct NOD {
    int vf;
    NOD* next;
};

typedef NOD* PNOD;
PNOD L[MaxN];

void quick(int* Sn, int lf, int rt)
{
    int i = lf - 1, j = rt + 1;
    if (lf >= rt) return;
    do
    {
		do { i++; } while (Sn[lf] < Sn[i]);
        do { j--; } while (Sn[lf] > Sn[j]);
        if (i < j)
        {
            int aux = Sn[i]; Sn[i] = Sn[j]; Sn[j] = aux;
        }
    } while (i < j);
    quick(Sn, lf, j);
    quick(Sn, j + 1, rt);
}

void df(int varf)
{
    sel[varf] = 1;
    
	int sum = varsta[varf], nrf = 0;
	int* Sn = new int[MaxN];
	
	Sn[++nrf] = sum;
	
    for (PNOD p = L[varf]; p; p=p->next)
        if (!sel[p->vf])
        {
            df(p->vf);
            sum += Sf[p->vf];
            Sn[++nrf] = Sf[p->vf];
        }
    
    quick(Sn, 1, nrf);
    
    int f = 1;
    while (sum > S) sum -= Sn[f], f++, brk++;
    
    Sf[varf] = sum;
    
    delete Sn;
}

void Add(int i, int j)
{
    PNOD p = new NOD;
    p->vf = j;
    p->next  =L[i];
    L[i] = p;
}
    
int main()
{
    int i, t, v;
    
    FILE *fin = fopen("mese.in", "rt");
    fscanf(fin, "%d %d", &N, &S);
    FOR(i, 1, N)
    {
        fscanf(fin, "%d %d", &t, &varsta[i]);
        if (t == 0) root = i;
        else
            Add(t, i);
    }
    fclose(fin);
    
    df(root);
    
    FILE *fout = fopen("mese.out", "wt");
    fprintf(fout, "%d", brk+1);
    fclose(fout);
    
    return 0;
}