60求助
查看原帖
60求助
740329
sunaohua楼主2023/3/14 07:48
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1000006];
long long val[1000006];
int y[1000006];
int cnt=0;
int root[1000006];
int croot[1000006];
int z[1000006];
vector<int> zz[1000006];
long long dp[10000006][2][3];
int q[1000006];
inline char nc(){
    static char buf[1000010],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000010,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    register int s=0,w=0;
    static char ch=nc();
    for(;!isdigit(ch);)ch=nc();
    for(;isdigit(ch);){
        s=(s<<1)+(s<<3)+(ch^48);
        ch=nc();
    }
    return w?-s:s;
}
inline long long max0(long long a,long long b){
    return a>b? a:b;
}
int p[1000006];
void find(int x){
    int w=x;
    y[x]=1;
    int to=a[x];
    q[1]=x;
    p[x]=1;
    int tot=1;
    while(!y[to]){
//  cout<<0<<" "<<to<<endl;
    tot++;
    q[tot]=to;
    p[to]=1;
    y[to]=1;
    x=to;
    to=a[to];
//  cout<<w<<" "<<x<<" "<<to<<endl;
    }
    if(p[to]){
//  cout<<1<<" "<<to<<endl;
    cnt++;
    root[cnt]=to;
    croot[cnt]=x;
//  cout<<cnt<<" "<<root[cnt]<<" "<<croot[cnt]<<"*"<<endl;
    }
    for(int i=1;i<=tot;i++)
    p[q[i]]=0,q[i]=0;

}
int flag=0;
void dps(int b,int fa,int th,int op,int rt){
/*  if(a==th&&(op==0||op==2))
    val[a]=-1e14;*/
    dp[b][1][op]=val[b];
    for(int i=0;i<z[b];i++){
    int to=zz[b][i];
    if(to==fa||to==rt)
    continue;
    if(to==th){
    if(flag==0){
    flag=1;
    }
    else
    continue;   
    }
    dps(to,b,th,op,rt);
    dp[b][1][op]+=dp[to][0][op];
    dp[b][0][op]+=max0(dp[to][0][op],dp[to][1][op]);
//  if(a==3)
//  cout<<max0(dp[to][0][op],dp[to][1][op])<<endl;
    }
    if(b==th){
    if(op==1)
    dp[b][0][op]=-1e18;
    if(op==2||op==0)
    dp[b][1][op]=-1e18;
    }
//  cout<<b<<" "<<op<<" "<<dp[b][0][op]<<" "<<dp[b][1][op]<<endl;
}
signed main(){
    long long ans=0;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
    val[i]=read();a[i]=read();
//cin>>val[i]>>a[i];
    z[i]++;
    z[a[i]]++;
    zz[i].push_back(a[i]);
    zz[a[i]].push_back(i);
    }
    for(int i=1;i<=n;i++){
    flag=0;
    if(!y[i])
    find(i);
    }
    for(int i=1;i<=cnt;i++){
    //cout<<"*"<<root[i]<<"*"<<croot[i]<<" "<<endl;
    if((a[root[i]]==croot[i])&&(a[croot[i]]==root[i])&&z[root[i]]==2&&z[croot[i]]==2){
    ans+=max0(val[root[i]],val[croot[i]]);  
    continue;
    }
    flag=0;
    dps(root[i],0,croot[i],0,root[i]);
    flag=0;
    dps(root[i],0,croot[i],1,root[i]);
    flag=0;
    dps(root[i],0,croot[i],2,root[i]);
    ans+=max0(max0(dp[root[i]][0][0],dp[root[i]][0][1]),dp[root[i]][1][2]);
    }
    cout<<ans;
    return 0;
}
2023/3/14 07:48
加载中...