#include #include #include #include #include #include #include #include const int LIMIT=150000; std::vector tree[LIMIT]; std::vector cost; std::vector sumCost; std::map sToG[LIMIT]; std::map countToP; std::map pToCount; long long int count=0; int humanCount=0; long long int ans=0; void g(int goal){ std::map::iterator it; //printf("?%d\n",goal); for(it=sToG[goal].begin();it!=sToG[goal].end();it++){ int start=(*it).first; long long int t=(*it).second; if(pToCount.find(start)!=pToCount.end()){ long long int count1=pToCount[start]; long long int count2=pToCount[goal]; long long int count3=std::min(count1,count2); std::map::iterator it2=countToP.lower_bound(count3); int center=(*it2).second; //std::cout<<"x="< noStc,iStc; std::stack oldCountStc; noStc.push(-1); iStc.push(-1); oldCountStc.push(-1); noStc.push(0); iStc.push(0); oldCountStc.push(count); pToCount[0]=count; countToP[count]=0; while(noStc.size()>1){ int no=noStc.top(); int i=iStc.top(); long long int oldCount=oldCountStc.top(); if(i==0){ g(no); } std::map::iterator it; //std::cout<<"\n no="< noStc,iStc; std::stack costStc; noStc.push(-1); iStc.push(-1); costStc.push(0); noStc.push(0); iStc.push(0); costStc.push(cost[0]); sumCost[0]=cost[0]; while(noStc.size()>1){ int no=noStc.top(); int i=iStc.top(); long long int sumc=costStc.top(); if (i