记录编号 593835 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2008] 骑士 最终得分 100
用户昵称 Gravatar徐诗畅 是否通过 通过
代码语言 C++ 运行时间 0.929 s
提交时间 2024-09-17 16:02:47 内存使用 15.64 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+5;
int n,a[N],head[N],cnt=1,vis[N],ans,x1,x2,ed,dp[N][5];
struct edge{
    int v,next;
}e[N]; 
void addedge(int u,int v){
    e[++cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt;
} 
void dfs(int u,int fa){
    vis[u]=1;
    for(int i = head[u];i;i=e[i].next){
        int v=e[i].v;
        if(v==fa) continue;
        if(vis[v]){
            x1=u; x2=v; ed=i; continue;
        }
        dfs(v,u);
    }
}
void DP(int u,int fa){
    dp[u][0]=0; dp[u][1]=a[u];
    for(int i = head[u];i;i=e[i].next){
        int v=e[i].v;
        if(v==fa||i==ed||(i^1)==ed) continue;
        DP(v,u);
        dp[u][0]+=max(dp[v][0],dp[v][1]);
        dp[u][1]+=dp[v][0];
    }
}
signed main(){
    freopen("bzoj_1040.in","r",stdin);
    freopen("bzoj_1040.out","w",stdout);
    scanf("%lld",&n);
    for(int i = 1;i<=n;i++){
        int x,y; scanf("%lld%lld",&x,&y);
        addedge(i,y); addedge(y,i);
        a[i]=x;
    }
    for(int i = 1;i<=n;i++){
        if(!vis[i]){
            dfs(i,-1); DP(x1,-1);
            int tmp=dp[x1][0];
            DP(x2,-1);
            ans+=max(tmp,dp[x2][0]);
        }
    }
    printf("%lld",ans);
    return 0;
}