社区讨论

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 条回复,欢迎继续交流。

正在加载回复...