90求助第10个点
查看原帖
90求助第10个点
428358
Grisses楼主2022/3/5 22:53
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,U,V,E,ans,tot,cnt,a[1000005],h[1000005],dp[1000005][2];
vector<int>vec;
struct edge{
	int v,nxt;
}e[2000005];
void adde(int u,int v){
	e[++cnt].nxt=h[u];
	h[u]=cnt;
	e[cnt].v=v;
}
bool vis[1000005],f[1000005];
void dfs(int x,int fa,int id){
	if(f[x]){
		U=x,V=fa;
		E=id;
		return;
	}
//	cerr<<x<<' '<<fa<<' '<<id<<endl;
	f[x]=1;
	vec.push_back(x);
	for(int i=h[x];i;i=e[i].nxt){
		if(e[i].v==fa)continue;
		dfs(e[i].v,x,i);
	}
}
void dfs1(int x,int fa){
//	cerr<<x<<' '<<fa<<endl;
	dp[x][1]=a[x];
	for(int i=h[x];i;i=e[i].nxt){
//		cerr<<"___"<<i<<endl;
		if(vis[i]){
//			cerr<<"_+_+_+_+_+_+_+_"<<endl;
			continue;
		}
		if(e[i].v==fa)continue;
		dfs1(e[i].v,x);
		dp[x][1]+=dp[e[i].v][0];
		dp[x][0]+=max(dp[e[i].v][1],dp[e[i].v][0]);
	}
}
signed main()
{
	scanf("%lld",&n);
	for(int i=1,v;i<=n;i++)scanf("%lld%lld",&a[i],&v),adde(i,v),adde(v,i);
	for(int i=1;i<=n;i++){
		if(!f[i]){
//			cerr<<"^^^^^^^^^^^^^^^^^^"<<i<<endl;
			vec.clear();
			dfs(i,0,0);
			if(E&1)vis[E]=vis[E+1]=1;
			else vis[E]=vis[E-1]=1;
//			cerr<<"+++"<<U<<' '<<V<<' '<<E<<" "<<(E^1)<<endl;
			dfs1(U,0);
			tot=max(dp[U][0],dp[U][1]);
//			cerr<<tot<<endl;
			for(int j=0;j<vec.size();j++)/*cerr<<vec[j]<<' ',*/dp[vec[j]][0]=dp[vec[j]][1]=0;
//			cerr<<endl;
			dfs1(V,0);
//			cerr<<max(dp[V][0],dp[V][1])<<endl;
			ans+=max(tot,max(dp[V][0],dp[V][1]));
		}
	}
	printf("%lld",ans);
	return 0;
}
2022/3/5 22:53
加载中...