玄关
查看原帖
玄关
944438
Only_Him楼主2024/6/24 20:49
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
#define int long long
int n,m;
vector<int> G[N]; 
int a[N];
int dp1[N][2],dp2[N][2];
bool used[N];
int x,y;
bool vis[N],vis1[N],vis2[N];
void bfs(int u){
	used[u] = true;
	for (auto v : G[u]){
		if (!used[v]) bfs[v];
	}
}
bool find_circle(int u,int fa){
	vis[u] = true;
	for (auto v : G[u]){
		if (v == fa) continue;
		if (!vis[v] && find_circle(v,u)) return true;
		if (vis[v]){
			x = u,y = v;
			return true;
		}
	}
	return false;
}

void dfs1(int u,int fa){
	dp1[u][0] = 0;
	dp1[u][1] = a[u];
	vis1[u] = true;
	for (auto v : G[u]){
		if (v == fa || vis1[v] == true) continue;
		dfs1(v,u);
		dp1[u][0] += max(dp1[v][0],dp1[v][1]);
		dp1[u][1] += dp1[v][0]; 
	}
}
void dfs2(int u,int fa){
	dp2[u][0] = 0;
	dp2[u][1] = a[u];
	vis2[u] = true;
	for (auto v : G[u]){
		if (v == fa || vis2[v] == true) continue;
		dfs2(v,u);
		dp2[u][0] += max(dp2[v][0],dp2[v][1]);
		dp2[u][1] += dp2[v][0];
	}
}
int ans;
signed main(){
	cin >> n;
	m = n;
	for (int i = 1;i <= n;i++){
		cin >> a[i];
		int v;
		cin >> v;
		G[i].push_back(v);
		G[v].push_back(i); 
	}
	for (int i = 1;i <= n;i++){
		if (used[i]) continue;
		bfs(i);
		bool flag = find_circle(i,0);
		dfs1(x,0),dfs2(y,0);
		ans += max(dp1[x][0],dp2[y][0]);
	}
	cout << ans << endl;
	return 0;
} 
2024/6/24 20:49
加载中...