50pts求助
查看原帖
50pts求助
823773
_sh1kong_楼主2023/5/31 21:17
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>

#define endl "\n"
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define int long long
#define ULL unsigned long long
#define ls(k) k << 1
#define rs(k) k << 1 | 1
#define mid(a, b) (a + b) >> 1 

const int N = 2e6 + 100, M = 520;

using namespace std;

inline int read(){
    int num = 0;
    char c;
    bool flag = false;
    while((c = getchar()) == ' ' || c == '\n' || c == '\r');
    if(c == '-') flag = true;
    else num = c - '0';
    while(isdigit(c = getchar())) num = num * 10 + c - '0';
    return (flag ? -1 : 1) * num;
} 

int n, ans, node;

int fa[N], val[N];

int h[N], idx;

struct edge

{
	int pre, to;
}e[N];

//vector <int> G[N];

bool vis[N];

int f[N][2];

void add(int a, int b)

{
	e[++ idx].pre = a, e[idx].to = b, h[a] = idx;
	fa[b] = a;
}

void dfs(int u)

{
	f[u][0] = 0, f[u][1] = val[u];
	vis[u] = true;
	for (int i = h[u]; i; i = e[i].pre)
	{
		int j = e[i].to;
		if (j == node) f[j][1] = -N;
		else
		{
			dfs(j);
			f[u][0] += max(f[j][0], f[j][1]);
			f[u][1] += f[j][0];
		}
	}
}

int work(int u)

{
	vis[u] = true;
	node = u;
	while (!vis[fa[node]])
	{
		node = fa[node];
		vis[node] = true;
	}
	dfs(node);
	int res = max(f[node][0], f[node][1]);
	vis[node] = true;
	node = fa[node];
	dfs(node);
	return max(res, max(f[node][0], f[node][1]));
}

signed main()

{
	IOS;
	
	n = read();
	for (int i = 1, d; i <= n; i ++ ) val[i] = read(), d = read(), add(d, i);
	for (int i = 1; i <= n; i ++ )
	{
		if (!vis[i]) ans += work(i);
	}
	cout << ans;
}
2023/5/31 21:17
加载中...