比赛 EYOI与SBOI开学欢乐赛11th 评测结果 AEAEAAAAAE
题目名称 骑士 最终得分 70
用户昵称 lihaoze 运行时间 2.873 s
代码语言 C++ 内存使用 26.48 MiB
提交时间 2022-10-14 21:05:19
显示代码纯文本
#include <bits/stdc++.h>

using i64 = long long;

const int N = 1e6+10;
i64 n, x, y, eg;
i64 a[N];
i64 f[N][2];
i64 e[N], ne[N], h[N], idx;
bool st[N];

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

void dfs(int u, int last) {
	st[u] = true;
	for (int i = h[u]; i != -1; i = ne[i]) {
		if ((i ^ 1) == last) continue;
		if (st[e[i]])
			x = u, y = e[i], eg = i;
		else 
			dfs(e[i], i);
	}
}

void dp(int u, int last) {
	f[u][1] = a[u], f[u][0] = 0;
	for (int i = h[u]; i != -1; i = ne[i]) {
		if (i == eg || (i ^ 1) == last || (i ^ 1) == eg) continue;
		int v = e[i];
		dp(v, i);
		f[u][0] += std::max(f[v][0], f[v][1]);
		f[u][1] += f[v][0];
	}
}

int main() {
	freopen("bzoj_1040.in", "r", stdin); 
	freopen("bzoj_1040.out", "w", stdout);
	memset(h, -1, sizeof h);
	std::cin >> n;
	for (int v = 1, u; v <= n; ++ v) 
		std::cin >> a[v] >> u, 
		add(u, v), add(v, u);
	i64 ans = 0;
	for (int i = 1; i <= n; ++ i)
		if (!st[i]) {
			dfs(i, 0);
			dp(x, 0);
			i64 nw = f[x][0];
			dp(y, 0);
			ans += std::max(nw, f[y][0]);
		}
	std::cout << ans << '\n';
	return 0;
}