10分求调
查看原帖
10分求调
217634
anonymous217楼主2023/8/29 17:06
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int ins[N],pre[N],vis[N];
int dp[N][2],n,lt,rt,x,dp2[N][2][2];
vector<int>nbr[N],cir;
void dfs1(int cur,int fa)
{
	pre[cur]=fa;
	vis[cur]=ins[cur]=1;
	for(int i=0;i<nbr[cur].size();i++)
	{
		int to=nbr[cur][i];
		if(to==fa)continue;
		if(vis[to])
		{
			if(ins[to])
			{
				lt=to;
				rt=cur;
				return;
			}
			continue;
		}
		pre[to]=cur;
		dfs1(to,cur);
	}
	ins[cur]=0;
}
void dfs2(int cur,int fa)
{
	for(int i=0;i<nbr[cur].size();i++)
	{
		int to=nbr[cur][i];
		if(to==fa||vis[to])continue;
		dfs2(to,cur);
		dp[cur][0]+=max(dp[to][0],dp[to][1]);
		dp[cur][1]+=dp[to][0];
	}
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>dp[i][1]>>x;
		nbr[i].push_back(x);
		nbr[x].push_back(i);
	}
	dfs1(1,0);
	for(int i=lt;i!=rt;i=pre[i])cir.push_back(i);
	cir.push_back(rt);memset(vis,0,sizeof(vis));
	for(int i=0;i<cir.size();i++)vis[cir[i]]=1;
	for(int i=0;i<cir.size();i++)dfs2(cir[i],0);
	dp2[0][0][0]=dp[cir[0]][0];
	dp2[0][1][1]=dp[cir[0]][1];
	for(int i=1;i<cir.size();i++)
	{
		dp2[i][0][0]=dp2[i][0][1]=dp[cir[i]][0];
		dp2[i][1][0]=dp2[i][1][1]=dp[cir[i]][1];
	}
	for(int i=1;i<cir.size()-1;i++)
	{
		dp2[i][0][0]+=max(dp2[i-1][1][0],dp2[i-1][0][0]);
		dp2[i][0][1]+=max(dp2[i-1][1][1],dp2[i-1][0][1]);
		dp2[i][1][0]+=dp2[i-1][0][0];
		dp2[i][1][1]+=dp2[i-1][0][1];
	}
    if(cir.size()-1!=2)
    {
        dp2[cir.size()-1][0][0]+=max(dp2[cir.size()-2][0][0],dp2[cir.size()-2][1][0]);
	    dp2[cir.size()-1][0][1]+=max(dp2[cir.size()-2][0][1],dp2[cir.size()-2][1][1]);
	    dp2[cir.size()-1][1][0]+=dp2[cir.size()-2][0][0];
	    dp2[cir.size()-1][1][1]=-1e9;
    }
	cout<<max(max(dp2[cir.size()-1][0][0],dp2[cir.size()-1][0][1]),dp2[cir.size()-1][1][0]);
	return 0;
}
2023/8/29 17:06
加载中...