Pagini recente » Cod sursa (job #878220) | Borderou de evaluare (job #2392721) | Cod sursa (job #36877)
Cod sursa(job #36877)
#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;
}