怎么去重边??
查看原帖
怎么去重边??
926886
kind_Ygg楼主2025/1/13 08:17
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=1e6+5;
int n;
int a[N];
vector<int> edge[N];
int dp[N][2];
bool vis[N];
int l,r;
void dfs(int rt,int fa)
{
	vis[rt]=1;
	for(auto i:edge[rt])
	{
		if(i!=fa)
		{
			if(vis[i])
				l=rt,r=i;
			else
				dfs(i,rt);
		}
	}
}
void treedp(int rt,int fa)
{
	dp[rt][0]=0;
	dp[rt][1]=a[rt];
	for(auto i:edge[rt])
	{
		if(i!=fa)
		{
			if(rt==l and i==r or i==l and rt==r) continue;
			treedp(i,rt);
			dp[rt][1]+=dp[i][0];
			dp[rt][0]+=max(dp[i][0],dp[i][1]);
		}
	}
}
int ans;
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1,x;i<=n;i++)
	{
		cin>>a[i]>>x;
		edge[i].push_back(x);
		edge[x].push_back(i);
	}
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			dfs(i,i);
			treedp(l,r);
			int now=dp[l][0];
			treedp(r,l);
			ans+=max(now,dp[r][0]);
		}
	}
//	for(int i=1;i<=n;i++) cout<<dp[i][1]<<' '<<dp[i][0]<<'\n';
	cout<<ans<<'\n';
	return 0;
}

已知是重边导致 WA

2025/1/13 08:17
加载中...