Pagini recente » Cod sursa (job #3277175) | Cod sursa (job #1559372) | Cod sursa (job #356814) | Cod sursa (job #2963868) | Cod sursa (job #44631)
Cod sursa(job #44631)
#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;
}