链式前向星的final(next)一定要是-1吗
查看原帖
链式前向星的final(next)一定要是-1吗
712509
FatLLion楼主2025/1/31 21:28
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 1e9;
const int N = 1e6+100;

void read (int &x) {
    int f = 1;x = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar();}
    while (ch >= '0' && ch <= '9') { x = x*10+ch-'0'; ch = getchar();}
    x *= f;
}

void print (int x) {
    if (x<0) putchar('-'), x = -x;
    if (x<10) putchar(x+'0');
    else print(x/10), putchar(x%10+'0');
}

struct R {
	int u, v, lst;
}road[N<<1];

int n, x1, x2, tot, ed, final[N];
ll dp[N][3], power[N];
bool vis[N];

void add (ll u, ll v) { road[tot].u = u, road[tot].v = v, road[tot].lst = final[u], final[u] = tot++; }

void find (int now, int fa) {
	vis[now] = true;
	for (int i = final[now];~i;i = road[i].lst) {
		if ((i^1) == fa) continue;
		if (vis[road[i].v]) {
			x1 = now, x2 = road[i].v, ed = i;
			continue;
		}
		find(road[i].v, i);
	}
}

void dfs (int now, int fa) {
	dp[now][0] = 0;
	dp[now][1] = power[now];
	for (int i = final[now];~i;i = road[i].lst) {
		int v = road[i].v;
		if ((i^1) == fa) continue;
		if (i == ed || (i^1) == ed) continue;
		dfs(v, i);
		dp[now][1] += dp[v][0];
		dp[now][0] += max(dp[v][1], dp[v][0]);
	}
}

int main () {
	//freopen("xxx.in", "r", stdin);
	//freopen("xxx.out", "w", stdout);
	read(n);
	memset(final, -1, sizeof final);
	for (int i = 1;i <= n;i++) {
		int a, b;
		read(a), read(b);
		add(i, b), add(b, i), power[i] = a*1ll;
	}
	
	ll ans = 0;
	for (int i =1 ;i <= n;i++) {
		if (vis[i]) continue;
		find(i, -1);
		dfs(x1, -1);
		ll a = dp[x1][0];
		dfs(x2, -1);
		ll b = dp[x2][0];
		ans += max(a, b);
	}
	printf("%lld\n", ans);
	return 0;
}

我的 add 函数和 final 本来是 :

void add (int u, int v) { road[++tot].u = u, road[tot].v = v, road[tot].lst = final[u], final[u] = tot; }

memset(final, 0, sizeof(final));

然后在枚举边的时候也不是 for(int i = final[now];~i;i = road[i].lst) 而是 for(int i = final[now];i;i = road[i].lst)

调用 find 和 dfs 时也不是 find(i, -1)dfs(x1/x2, -1) 而是 find(i, 0)dfs(x1/x2, 0)

可是如果这样的话就会在 dfs 函数那里死循环,改成上面完整代码的样子就可以,请问是为什么,萌新求助QWQ

2025/1/31 21:28
加载中...