社区讨论

玄关,样例都 RE 求调

P2607[ZJOI2008] 骑士参与者 3已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mhjht8tt
此快照首次捕获于
2025/11/04 02:48
4 个月前
此快照最后确认于
2025/11/04 02:48
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct edge{
    int to,nxt;
}e[2000005];
int hd[1000005],tot;
long long ans,f[1000005][2];
int w[1000005],vis[1000005];
int x1,x2,E;
void add(int u,int v){
    e[++tot].to=v;
    e[tot].nxt=hd[u];
    hd[u]=tot;
}
void dfs(int u,int pre){
    f[u][1]=w[u];
    f[u][0]=0;
    for(int i=hd[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(i==E||i==(E^1)) continue;
        if(v==pre) continue;
        dfs(v,u);
        f[u][1]+=f[v][0];
        f[u][0]+=max(f[v][0],f[v][1]);
    }
}
void find(int u,int pre){
    vis[u]=1;
    for(int i=hd[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==pre) continue;
        if(vis[v]){
            x1=u;
            x2=v;
            E=i;
            continue;
        }
        find(v,u);
    }
}
int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        int p;cin>>w[i]>>p;
        add(i,p);add(p,i);
    }
    for(int i=1;i<=n;i++){
        if(vis[i]) continue;
        find(i,-1);
        dfs(x1,-1);
        long long tmp=f[x1][0];
        dfs(x2,-1);
        tmp=max(tmp,f[x2][0]);
        ans+=tmp;
    }
    cout<<ans;
    return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...