找环出了问题?
#include <bits/stdc++.h>
#define int long long
using namespace std;
template <class T>
inline void read(T &x) {
x = 0; char c = getchar(); bool f = 0;
for (; !isdigit(c); c = getchar()) f ^= c == '-';
for (; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
x = f ? -x : x;
}
template <class T>
inline void write(T x) {
if (x < 0) {putchar('-'); x = -x;}
T y = 1; int len = 1;
for (; y <= x / 10; y *= 10) ++len;
for (; len; --len, x %= y, y /= 10) putchar(x / y + 48);
}
const int MAXN = 5000000 + 5;
int n, cnt, ans, x1, x2;
int f[MAXN][2], hd[MAXN], val[MAXN];
bool vis[MAXN];
struct edge{
int nt, v;
}e[MAXN];
inline void add(int u, int v) {
e[++cnt].v = v;
e[cnt].nt = hd[u];
hd[u] = cnt;
}
void find(int u, int fa) {
vis[u] = 1;
for(int i = hd[u]; i; i = e[i].nt) {
if(e[i].v == fa) continue;
if(vis[e[i].v]) {
x1 = u, x2 = e[i].v;//环
continue;
}
find(e[i].v, u);
}
}
void dfs(int u, int fa) {
f[u][0] = 0; f[u][1] = val[u];
for(int i = hd[u] ; i; i = e[i].nt) {
if(e[i].v == fa) continue;
if((u == x1 && e[i].v == x2) || (u == x2 && e[i].v == x1)) continue;
dfs(e[i].v, u);
f[u][1] += f[e[i].v][0];
f[u][0] += max(f[e[i].v][1], f[e[i].v][0]);
}
}
signed main() {
read(n);
for(int i = 1; i <= n; ++i) {
int v;
read(val[i]), read(v);
add(i, v), add(v, i);
}
for(int i = 1; i <= n; ++i) {
if(vis[i]) continue;
find(i, -1);
dfs(x1, -1);
int temp = f[x1][0];
dfs(x2, -1);
temp = max(temp, f[x2][0]);
ans += temp;
}
write(ans);
return 0;
}