为什么缩点 + 记搜会TLE
查看原帖
为什么缩点 + 记搜会TLE
453555
qW__Wp楼主2024/4/16 21:33

RT. T了第三个点

貌似没有题解详细提到

代码:

#include <bits/stdc++.h>
#define INF 0x3fffffff
#define INFF 1e18
#define endl '\n'
#define lson id << 1
#define rson id << 1 | 1

using namespace std;

const int N = 5e5 + 5;

int hd[N], cnt;
int w[N], x[N << 1], y[N << 1];
bool vis[N], can[N];
int low[N], dfn[N], times, st[N], top, tot, color[N], sum[N], num[N];
int n, m, s, p, S;

struct Edge {
	int to, nx;
} e[N << 1];

void add(int u, int v) {
	e[ ++ cnt] = {v, hd[u]}, hd[u] = cnt;
}

void tarjan(int u) {
	low[u] = dfn[u] = ++ times;
	st[ ++ top] = u;
	for (int i = hd[u]; i; i = e[i].nx) {
		int v = e[i].to;
		if (!dfn[v]) {
			tarjan(v), low[u] = min(low[u], low[v]);
		} else if (!color[v]) {
			low[u] = min(low[u], dfn[v]);
		}
	}
	if (low[u] == dfn[u]) {
		tot ++;
		while (1) {
			int v = st[top --];
			color[v] = tot, sum[tot] += w[v];
			if (vis[v]) can[tot] = 1;
			if (v == s) S = tot;
			if (v == u) break;
		}
	}
}

void dfs(int u, int fa) {
	if (num[fa] + sum[u] <= num[u]) return;
	num[u] = max(num[u], num[fa] + sum[u]);
	for (int i = hd[u]; i; i = e[i].nx) {
		int v = e[i].to;
		dfs(v, u);
	}
}

signed main() {
	cin >> n >> m;
	for (int i = 1; i <= m; i ++) {
		cin >> x[i] >> y[i];
		add(x[i], y[i]);
	}
	for (int i = 1; i <= n; i ++) cin >> w[i];
	cin >> s >> p;
	for (int i = 1; i <= p; i ++) {
		int x;
		cin >> x;
		vis[x] = 1;
	}
	for (int i = 1; i <= n; i ++)
		if (!dfn[i]) top = 0, tarjan(i);
	memset(hd, 0, sizeof hd);
	memset(e, 0, sizeof e);
	cnt = 0;
	for (int i = 1; i <= m; i ++) {
		int u = color[x[i]], v = color[y[i]];
		if (u != v) add(u, v);
	}
	dfs(S, S);
	int ans = 0;
	for (int i = 1; i <= tot; i ++) {
		if (!can[i]) continue;
		ans = max(ans, num[i]);
	}
	cout << ans;
	return 0;
}
2024/4/16 21:33
加载中...