社区讨论
萌新代码求调,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 条回复,欢迎继续交流。
正在加载回复...