90分 WA求助各位大佬 ---来自蒻芶
查看原帖
90分 WA求助各位大佬 ---来自蒻芶
609170
xin_fu楼主2022/6/20 19:32
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long n,a[N],f[N][2],fa[N],v[N];
long long cnt,ans;
struct edge{
	int e,nxt;
}ed[N<<1];
int ft[N],en;
struct mmp{
	int x,y;
}h[N];
void add(int x,int y)
{
	ed[en].e=y;
	ed[en].nxt=ft[x];
	ft[x]=en++;
} 
int fd(int x)
{
	if(x!=fa[x])
		fa[x]=fd(fa[x]);
	return fa[x];
}
void dp(int x,int from)
{
	f[x][0]=0;f[x][1]=a[x];
	for(int i=ft[x];i;i=ed[i].nxt)
	{
		int y=ed[i].e;
		if(y==from)continue;
		dp(y,x);
		f[x][0]+=max(f[y][1],f[y][0]);
		f[x][1]+=f[y][0];
	} 
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		fa[i]=i;
	for(int i=1;i<=n;i++)
	{
		int v;
		cin>>a[i]>>v;
		int x=fd(i),y=fd(v);
		if(x!=y)
		{
			fa[y]=x;
			add(i,v),add(v,i);
		}
		else
		{
			h[++cnt].x=i;
			h[cnt].y=v;
		}
	}
	for(int i=1;i<=cnt;i++)
	{
			dp(h[i].x,-1);
			long long t=f[h[i].x][0];
			dp(h[i].y,-1);
			t=max(t,f[h[i].y][0]);
			ans+=t;
	}
	cout<<ans;
	return 0;
}
2022/6/20 19:32
加载中...