50pts求助
查看原帖
50pts求助
597737
zhoujinrui楼主2022/10/28 10:30

找环出了问题?

code

#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;
}
2022/10/28 10:30
加载中...