- 数学
- 2025-08-05 14:46:28 @
#include <bits/extc++.h>
#define endl '\n'
typedef long long ll;
#define int ll
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
struct ly {
int to, nxt;
};
void Main() {
int n, m;
cin >> n >> m;
vector<int> w(n + 1), fst(n + 1), uap(n + 1), dep(n + 1), he(n + 1);
vector<ly> edge(1);
auto add = [&](const int u, const int v) {
edge.emplace_back(v, he[u]);
he[u] = static_cast<int>(edge.size()) - 1;
};
ranges::fill(fst | views::drop(1), 1);
ranges::fill(uap | views::drop(1), 1);
for (int &x: w | views::drop(1)) {
cin >> x;
}
for (int i = 1, u, v; i <= m; ++i) {
cin >> u >> v;
fst[v] = 0;
uap[u] = uap[v] = 0;
add(u, v);
}
set<int> s;
int umx = 0, mx = 0;
for (int i = 1; i <= n; ++i) {
if (uap[i]) {
umx = max(umx, w[i]);
} else if (fst[i]) {
dep[i] = 1;
mx = 1;
for (int _ = he[i], j = edge[_].to; _; _ = edge[_].nxt, j = edge[_].to) {
dep[j] = 2;
}
} else {
s.insert(i);
}
}
while (!s.empty()) {
for (int i = 1; i <= n; ++i) {
if (dep[i] && s.contains(i)) {
mx = max(mx, dep[i]);
for (int _ = he[i], j = edge[_].to; _; _ = edge[_].nxt, j = edge[_].to) {
dep[j] = max(dep[j], dep[i] + 1);
}
s.erase(i);
}
}
}
vector<int> fls(mx + 1);
mx = 0;
for (int i = 1; i <= n; ++i) {
fls[dep[i]] = max(fls[dep[i]], w[i]);
}
int res = 0;
for (const int x: fls | views::drop(1)) {
res += x;
mx = max(mx, x);
}
if (mx < umx) {
(res -= mx) += umx;
}
cout << res << endl;
}
// #define CP_MULTI_TEST_CASES
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t = 1;
#ifdef CP_MULTI_TEST_CASES
cin >> t;
#endif
while (t--) {
Main();
}
return 0;
}
0 条评论
目前还没有评论...