Cod sursa(job #43752)

Utilizator devilkindSavin Tiberiu devilkind Data 30 martie 2007 14:54:03
Problema Mese Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <stdlib.h>
#define M 100001

typedef struct _lnod {int nn; struct _lnod *urm;} lnod;

typedef struct _nod {int v; int t; int V; int niv; lnod *f;} nod;

int q[M],sz=sizeof(lnod),nrdiv,dim;

nod a[M];

int fc(const void *x,const void *y)
{return a[*(int *)y].V-a[*(int *)x].V;}

void proces(int r)
{int i=0,v[M]; lnod *p;
 if(a[r].V>dim) {
p=a[r].f; while(p) {v[i++]=p->nn; p=p->urm;}
qsort(v,i,sizeof(int),fc);
for(i=0;a[r].V>dim;i++)
 {a[r].V-=a[v[i]].V;
  nrdiv++;}}
a[a[r].t].V+=a[r].V;
}

int main()
{FILE *fi,*fo;
 int i,k,n,rad=0,iq,sq; lnod *p;
 
fi=fopen("mese.in","rt");
fscanf(fi,"%d %d",&n,&dim);

for(i=1;i<=n;i++) {fscanf(fi,"%d %d",&k, &a[i].v); a[i].t=k; a[i].V=a[i].v;
		   if(!k) rad=i; else {p=(lnod *)malloc(sz); p->nn=i; p->urm=a[k].f; a[k].f=p;}
		   }
		   
fclose(fi);
q[1]=rad; iq=sq=1;

while(iq<=sq) {k=q[iq]; a[k].niv=a[a[k].t].niv+1; p=a[k].f; 
               while(p) {q[++sq]=p->nn; p=p->urm;} iq++;}
               
for(i=n;i>0;i--) proces(q[i]);
fo=fopen("mese.out","wt");
fprintf(fo,"%d\n",nrdiv+1);
fclose(fo); return 0;}