Cod sursa(job #44631)

Utilizator stef2nStefan Istrate stef2n Data 31 martie 2007 16:39:44
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <stdio.h>

#define infile "mese.in"
#define outfile "mese.out"
#define NMAX 100001
struct NOD {int x; NOD *adr;};

FILE *fin,*fout;
int n,S;
NOD *prim[NMAX];
short int varsta[NMAX];
int root;
short int rest[NMAX]; int grup[NMAX];

int N; short int heap[NMAX];

void adaug_st(NOD *(&prim), int x)
  {
   NOD *a=new NOD;
   a->x=x;
   a->adr=prim;
   prim=a;
  }

void read_data()
  {
   int aux;
   fin=fopen(infile,"r");
   fscanf(fin,"%d %d",&n,&S);
   for(int i=0;i<n;i++)
      {
       fscanf(fin,"%d %d",&aux,&varsta[i]);
       if(aux==0)
         root=i;
       else
        {
         adaug_st(prim[aux-1],i);
         adaug_st(prim[i],aux-1);
        }
      }
   fclose(fin);
  }

void ridica(int poz)
  {
   int aux;
   while(poz>1)
        {
         if(heap[poz]>=heap[poz/2])
           return;
         aux=heap[poz];
         heap[poz]=heap[poz/2];
         heap[poz/2]=aux;
         poz>>=1;
        }
  }

void scufunda(int poz)
  {
   while(2*poz<=N)
        {
         int min=heap[poz],minpoz=poz;
         if(min>heap[2*poz])
           {
            min=heap[2*poz];
            minpoz=2*poz;
           }
         if(2*poz+1<=N && min>heap[2*poz+1])
           {
            min=heap[2*poz+1];
            minpoz=2*poz+1;
           }
         if(minpoz==poz)
           return;
         heap[minpoz]=heap[poz];
         heap[poz]=min;
         poz=minpoz;
        }
  }

void df(int varf, int tata)
  {
   NOD *b=prim[varf];
   while(b)
        {
         if(b->x!=tata)
           df(b->x,varf);
         b=b->adr;
        }
   b=prim[varf];
   grup[varf]=0;
   N=0;
   while(b)
        {
         if(b->x!=tata)
           {
            grup[varf]+=grup[b->x];
            heap[++N]=rest[b->x];
            ridica(N);
           }
         b=b->adr;
        }
   rest[varf]=varsta[varf];
   while(N>0 && rest[varf]+heap[1]<=S)
        {
         rest[varf]+=heap[1];
         heap[1]=heap[N--];
         scufunda(1);
        }
   grup[varf]+=N;
  }


int main()
{
read_data();
df(root,-1);
fout=fopen(outfile,"w");
fprintf(fout,"%d\n",grup[root]+(rest[root]!=0));
fclose(fout);
return 0;
}