Cod sursa(job #36877)

Utilizator mastermageSchneider Stefan mastermage Data 24 martie 2007 11:31:26
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;

struct st{
	int nod,age;
	bool operator < (const st&x) const{
		return age>x.age;
	}
};

typedef priority_queue<st> pq;

#define maxN 100100

int n,s,res,boss[maxN],din[maxN], v1[maxN],v2[maxN],alone[maxN];
pq q1,q2;

void inputFunc(){
	FILE*fi=fopen("mese.in","r");
	fscanf(fi,"%d %d",&n,&s);
	for(int i=1;i<=n;i++){
		int b,a; fscanf(fi,"%d %d",&b,&a);
		boss[i]=b;din[i]=a;alone[b]=1;
	}
	
	for(int i=1;i<=n;i++)if(!alone[i]){
		st x; x.nod=i;x.age=din[i]; q1.push(x);	v1[i]++;
	}
	
	fclose(fi);
}

void outputFunc(){
	FILE*fi=fopen("mese.out","w");
	fprintf(fi,"%d",res+1);
	fclose(fi);
}


int main(){
	inputFunc();
	pq*sou=&q1,*des=&q2; int*vs=v1,*vd=v2;
	
	while(!sou->empty()){
		while(!sou->empty()){
			st c=sou->top(),nex;sou->pop();
			if(vs[c.nod]==1){
				int b=boss[c.nod];
				if(b){
					if(c.age+din[b]<=s)din[b]+=c.age; else res++;
					nex.age=din[b]; nex.nod=b;
					des->push(nex);
					vd[b]++;
				}
			}
			vs[c.nod]--;
		}
		
		swap(vs,vd);
		swap(sou,des);
	}
	
	
	outputFunc();
	return 0;
}