社区讨论
0pts 秋条
P3647[APIO2014] 连珠线参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mi44p486
- 此快照首次捕获于
- 2025/11/18 13:24 3 个月前
- 此快照最后确认于
- 2025/11/18 23:51 3 个月前
每个 Subtask 都是 AC 一些 WA 一些
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
struct node{
int to,next;ll w;
}e[N<<1];
int h[N],cnt;
int n;ll ans,fa_w[N];
ll f[N][2],mx[N][2][2],val[N][2],g[N];
void Link(int u,int v,ll w){
e[++cnt]={v,h[u],w};
h[u]=cnt;
}
void dfs1(int x,int fa){
mx[x][0][0]=mx[x][1][0]=INT_MIN;
for(int i=h[x];i;i=e[i].next){
int y=e[i].to;
if(y==fa)continue;
fa_w[y]=e[i].w;
dfs1(y,x);
f[x][0]+=max(f[y][0],f[y][1]+e[i].w);
ll v=f[y][0]+e[i].w-max(f[y][0],f[y][1]+e[i].w);
if(mx[x][0][0]<v){
mx[x][1][0]=mx[x][0][0];mx[x][1][1]=mx[x][0][1];
mx[x][0][0]=v;mx[x][0][1]=y;
}else if(mx[x][1][0]<v){
mx[x][1][0]=v;mx[x][1][1]=y;
}
}
f[x][1]=f[x][0]+mx[x][0][0];
}
void dfs2(int x,int fa){
ans=max(ans,g[x]);
//cout<<x<<' '<<f[x][0]<<' '<<f[x][1]<<' '<<g[x]<<endl;
for(int i=h[x];i;i=e[i].next){
int y=e[i].to;
if(y==fa)continue;
if(mx[x][0][1]==y){
swap(mx[x][0][0],mx[x][1][0]);
swap(mx[x][0][1],mx[x][1][1]);
}
val[x][0]=g[x]-max(f[y][0],f[y][1]+e[i].w);
val[x][1]=val[x][0]+mx[x][0][0];
if(fa)
val[x][1]=max(val[x][1],val[x][0]+val[fa][0]+fa_w[x]-max(val[fa][0],val[fa][1]+fa_w[x]));
g[y]=f[y][0]+max(val[x][0],val[x][1]+e[i].w);
if(mx[x][0][1]<mx[x][1][1]){
swap(mx[x][0][0],mx[x][1][0]);
swap(mx[x][0][1],mx[x][1][1]);
}
dfs2(y,x);
}
}
int main(){
cin>>n;
for(int i=1;i<=n-1;i++){
int u,v;ll w;
cin>>u>>v>>w;
Link(u,v,w);
Link(v,u,w);
}
dfs1(1,0);
g[1]=f[1][0];
dfs2(1,0);
cout<<ans;
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...