This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<stdio.h>
#include<math.h>
#include<vector>
#define LL long long
#define MAX_N 200005
#define MAX(x,y) ((x)>(y)?(x):(y))
using namespace std;
struct emp{
LL y,cost;
bool operator < (emp d) const{
return cost>d.cost;
}
};
LL n;
LL master[MAX_N],branch[MAX_N];
vector<emp> net[MAX_N];
void make_branch(LL x,LL pa,LL cost){
LL i,sz;
sz=net[x].size();
branch[pa]=MAX(branch[pa],branch[x]);
for(i=0;i<sz;i++){
if(net[x][i].y==pa) continue;
branch[pa]=MAX(branch[pa],branch[net[x][i].y]+net[x][i].cost+cost);
}
}
void merge(LL x,LL pa,LL cost){
LL i,sum,sz;
emp max_branch[3],max_master[3];
max_branch[0].cost=max_branch[1].cost=-1;
max_branch[0].y=max_branch[1].y=0;
max_master[0].cost=max_master[1].cost=-1;
max_master[0].y=max_master[1].y=0;
sz=net[x].size();
if(pa && sz<3) return;
if(!pa && sz<2) return;
for(i=0;i<sz;i++){
if(net[x][i].y==pa) continue;
if(branch[net[x][i].y]+net[x][i].cost>max_branch[0].cost){
max_branch[1]=max_branch[0];
max_branch[0].cost=branch[net[x][i].y]+net[x][i].cost;
max_branch[0].y=net[x][i].y;
}else if(branch[net[x][i].y]+net[x][i].cost>max_branch[1].cost){
max_branch[1].cost=branch[net[x][i].y]+net[x][i].cost;
max_branch[1].y=net[x][i].y;
}
}
for(i=0;i<sz;i++){
if(net[x][i].y==pa) continue;
if(master[net[x][i].y]+net[x][i].cost>max_master[0].cost){
max_master[1]=max_master[0];
max_master[0].cost=master[net[x][i].y]+net[x][i].cost;
max_master[0].y=net[x][i].y;
}else if(master[net[x][i].y]+net[x][i].cost>max_master[1].cost){
max_master[1].cost=master[net[x][i].y]+net[x][i].cost;
max_master[1].y=net[x][i].y;
}
}
if(max_master[0].y-max_branch[0].y){
master[x]=MAX(master[x],max_master[0].cost+max_branch[0].cost);
}else{
master[x]=MAX(master[x],MAX(max_master[0].cost+max_branch[1].cost,max_master[1].cost+max_branch[0].cost));
}
}
void make_master(LL x,LL pa,LL cost){
LL i,sz;
sz=net[x].size();
for(i=0;i<sz;i++){
if(net[x][i].y-pa) make_master(net[x][i].y,x,net[x][i].cost);
master[x]=MAX(master[x],master[net[x][i].y]);
}
make_branch(x,pa,cost);
merge(x,pa,cost);
}
int main(){
LL i,x,y,cost;
emp node;
scanf("%lld",&n);
for(i=1;i<n;i++){
scanf("%lld %lld %lld",&x,&y,&cost);
node.y=y;
node.cost=cost;
net[x].push_back(node);
node.y=x;
net[y].push_back(node);
}
make_master(1,0,0);
printf("%lld\n",master[1]);
return 0;
}
Compilation message (stderr)
beads.cpp: In function 'void merge(long long int, long long int, long long int)':
beads.cpp:27:7: warning: unused variable 'sum' [-Wunused-variable]
LL i,sum,sz;
^~~
beads.cpp: In function 'int main()':
beads.cpp:79:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld",&n);
~~~~~^~~~~~~~~~~
beads.cpp:81:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld %lld %lld",&x,&y,&cost);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |