大佬救救我这个2.4点玄学MLE的孩子吧
查看原帖
大佬救救我这个2.4点玄学MLE的孩子吧
91958
HJHst楼主2019/11/7 15:11
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>

using namespace std;
long long n,num,ans,tot,cnt;
double k;
long long root1,root2,bh;
int a[1000005];
int v[1000005];
int head[1000005];
long long dp[1000005][2];

struct node{
	int to,next;
}e[2000005];

void add(long long from,long long to)
{
	e[num].to=to;
	e[num].next=head[from];
	head[from]=num++;
}

void dfs(long long s,long long f)
{
	v[s]=1;
	for(long long i=head[s];i;i=e[i].next)
	{
		if((i^1)==f) continue;
		if(v[e[i].to])
		{
			root1=s;
			root2=e[i].to;
			bh=i;
			continue;
		}
		dfs(e[i].to,i);
	}
}

void DP(long long s,long long f)
{
	dp[s][1]=a[s];
	dp[s][0]=0;
	for(long long i=head[s];i;i=e[i].next)
	{
		if((i^1)==f) continue;
//		if((s==root1&&e[i].to==root2)||
//		(e[i].to==root1&&s==root2)) continue;
		if(i==bh||(i^1)==bh) continue;
		DP(e[i].to,i);
		dp[s][0]+=max(dp[e[i].to][0],dp[e[i].to][1]);
		dp[s][1]+=dp[e[i].to][0];
	}
}

void solve(long long s)
{
	dfs(s,0);
//	cout<<root1<<" "<<root2<<endl;
	ans=0;
	DP(root1,-2);
	ans=dp[root1][0];
	DP(root2,-2);
	ans=max(ans,dp[root2][0]);
//	cout<<ans<<endl;
	tot+=ans;
}

int main()
{
//	freopen("a.out","w",stdout);
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(i,y);add(y,i);a[i]=x;
	}
	for(long long i=1;i<=n;i++)
	if(!v[i])solve(i);
	cout<<tot;
	return 0;
}
2019/11/7 15:11
加载中...