求hack数据
查看原帖
求hack数据
181433
abs_0楼主2020/10/10 18:08
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

int n,t,special,a[1000010],fa[1000010];
bool b[1000010];
vector <int> v[1000010];
long long ans=0,f[1000010][2];

void dfs(int x);
void dp(int x);

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i],&fa[i]);
		v[fa[i]].push_back(i);
	}
	long long sum=0;
	for(int i=1;i<=n;i++)
		if(!b[i]){
			t=special=sum=0;
			dfs(i);
			dp(t);
			sum=f[t][1];
			special=0;
			dp(t);
			sum=max(sum,f[t][0]);
			ans+=sum;
		}
	printf("%d",ans);
	return 0;				
}
void dfs(int x){
	b[x]=1;
	int g=fa[x];
	if(b[g]){
		t=x;
		special=g;
		return ;
	}
	dfs(g);
	return ;
}
void dp(int x){
	b[x]=1;
	int g=0,h=0;
	f[x][1]=a[x];
	f[x][0]=0;
	for(int i=0;i<v[x].size();i++){
		g=v[x][i];
		if(g==t)
			continue ;
		dp(g);
		f[x][1]+=f[g][0];
		h=f[x][0];
		f[x][0]+=f[g][0];
		if(g!=special)
			f[x][0]=max(f[x][0],h+f[g][1]);
	}
}
2020/10/10 18:08
加载中...