RE玄3关
查看原帖
RE玄3关
1198296
封禁用户楼主2024/3/17 12:16
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int fa[N],val[N],mark;
int dp[N][2];
bool vis[N];
vector<int> G[N];
void addEdge(int from,int to){
	G[from].push_back(to);
	fa[to]=from;
}
void dfs(int u){
	dp[u][0]=0;
	dp[u][1]=val[u];
	vis[u]=1;
	for(auto i:G[u]){
		if(i==mark) continue;
		dfs(i);
		dp[u][1]+=dp[i][0];
		dp[u][0]+=max(dp[i][0],dp[i][1]);
	}
}
int check(int u){
	vis[u]=1;
	int f=fa[u];
	if(vis[f]) return f;
	else check(f);
}
int solve(int u){
	int ans=0;
	mark=check(u);
	dfs(mark);
	ans=max(ans,dp[mark][0]);
	mark=fa[mark];
	dfs(mark);
	ans=max(ans,dp[mark][0]);
	return ans;
}
signed main(){
	int n;
	cin>>n;
	int x;
	for(int i=1;i<=n;++i){
		cin>>val[i]>>x;
		addEdge(x,i);
	}
	int ans=0;
	for(int i=1;i<=n;++i){
		if(!vis[i]) ans+=solve(i);
	}cout<<ans<<endl;
    return 0;
}
2024/3/17 12:16
加载中...