Cod sursa(job #45495)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 1 aprilie 2007 16:24:24
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define maxn 100010
#define pb push_back

int n,S,x;
vector <int> a[maxn];
int cost[maxn],c[maxn],d[maxn],g[maxn],p[maxn];

int cmp(int i,int j)
{
    return d[a[x][i]]<d[a[x][j]];
}

void DFS(int nod)
{
     int i;
     
     for (i=0;i<g[nod];i++) DFS(a[nod][i]);
     
     if (g[nod]==0) 
     {
          c[nod]=1;
          d[nod]=cost[nod];
     }
     else {
                for (i=0;i<g[nod];i++) p[i]=i;
                x=nod;
                sort(p,p+g[nod],cmp);
                d[nod]=cost[nod];
                c[nod]=1;
                for (i=0;i<g[nod];i++) c[nod]+=c[a[nod][i]];
                
                for (i=0;i<g[nod] && d[nod]+d[a[nod][p[i]]]<=S;i++) 
                {
                    d[nod]+=d[a[nod][p[i]]];
                    c[nod]--;
                }
          }
}

int main()
{
    freopen("mese.in","r",stdin);
    freopen("mese.out","w",stdout);
    
    int i,x,y;
    
    scanf("%d %d ",&n,&S);
    
    for (i=1;i<=n;i++)
    {
        scanf("%d %d ",&x,&cost[i]);
        a[x].pb(i);
    }
    
    for (i=0;i<=n;i++) g[i]=a[i].size();
    
    DFS(0);
    
    printf("%d\n",c[0]);
    
    return 0;
}