社区讨论

萌新代码求调,WA on 1416

P4742[Wind Festival] Running In The Sky参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjksxqh
此快照首次捕获于
2025/11/04 04:11
4 个月前
此快照最后确认于
2025/11/04 04:11
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 10;

int n, m, k[N];
int dp[N][2];
int dfn[N], low[N], idx = 0, ins[N], bel[N], sum[N], ma[N], cnt = 0;
bool vis[N];
vector<int> vec[N];
stack<int> stk;
vector<int> e[N];

void dfs(int u) {
	dfn[u] = low[u] = ++idx;
	ins[u] = true;
	stk.push(u);
	for (auto v : e[u]) {
		if (!dfn[v]) {
			dfs(v);
			low[u] = min(low[u], low[v]);
		} else {
			if (ins[v])
				low[u] = min(low[u], dfn[v]);
		}
	}
	if (dfn[u] == low[u]) {
		cnt++;
		while (true) {
			int v = stk.top();
			vec[cnt].push_back(v);
			ma[cnt] = max(ma[cnt], k[v]);
			sum[cnt] += k[v];
			ins[v] = false;
			bel[v] = cnt;
			stk.pop();
			if (u == v)
				break;
		}
	}
}

int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> k[i];
	for (int i = 1; i <= m; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
	}
	for (int i = 1; i <= n; i++)
		if (!dfn[i])
			dfs(i);
	for (int i = 1; i <= cnt; i++)
		dp[i][0] = sum[i], dp[i][1] = ma[i];
	for (int i = cnt; i >= 1; i--) {
		for (auto u : vec[i]) {
			for (auto v : e[u])
				if (!vis[bel[v]] && bel[v] != i) {
					vis[bel[v]] = true;
					if (dp[v][0] < dp[i][0] + sum[v]) {
						dp[v][0] = dp[i][0] + sum[v];
						dp[v][1] = max(dp[i][1], ma[v]);
					}
					if (dp[v][0] == dp[i][0] + sum[v])
						dp[v][1] = max(dp[v][1], dp[i][1]);
				}
		}
		for (auto u : vec[i])
			for (auto v : e[u])
				vis[u] = false; 
	} 
	int ans = 1;
	for (int i = 2; i <= cnt; i++)
		if (dp[i][0] > dp[ans][0] || (dp[i][0] == dp[ans][0] && dp[i][1] > dp[ans][1]))
			ans = i;
	cout << dp[ans][0] << ' ' << dp[ans][1] << '\n';
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...