/ WOJ / 讨论 / 数学 /

tomcat

#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 条评论

目前还没有评论...