Submission #1080968

#TimeUsernameProblemLanguageResultExecution timeMemory
1080968avighnaAesthetic (NOI20_aesthetic)C++17
20 / 100
2098 ms39508 KiB
#include <bits/stdc++.h>

typedef long long ll;

struct To {
  ll v, w;
  ll i;
};

const ll inf = 1e15;

int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);

  ll n, m;
  std::cin >> n >> m;
  std::vector<std::vector<To>> adj(n + 1);
  std::vector<ll> roads(m);
  for (ll i = 0, u, v, w; i < m; ++i) {
    std::cin >> u >> v >> w;
    adj[u].push_back({v, w, i});
    adj[v].push_back({u, w, i});
    roads[i] = w;
  }

  if (m == n - 1) {
    // there will only be one path
    std::set<ll> edges;
    std::function<bool(ll, ll)> dfs;
    ll def = 0;
    dfs = [&](ll node, ll par) {
      if (node == n) {
        return true;
      }
      for (auto &[ch, w, i] : adj[node]) {
        if (ch == par) {
          continue;
        }
        if (dfs(ch, node)) {
          edges.insert(i);
          def += w;
          return true;
        }
      }
      return false;
    };
    dfs(1, 0);

    ll ans = def;
    ll worst_road = roads[m - 1];
    for (ll i = m - 2; i >= 0; --i) {
      if (edges.count(i)) {
        ans = std::max(ans, def + worst_road);
      }
      worst_road = std::max(worst_road, roads[i]);
    }
    std::cout << ans << '\n';

    return 0;
  }

  // exclude edge i
  auto sssp = [&](ll i, ll add) {
    std::vector<ll> ans(n + 1, inf);
    std::vector<bool> vis(n + 1);
    std::priority_queue<std::pair<ll, ll>> pq;
    pq.push({0, 1});
    while (!pq.empty()) {
      auto [d, node] = pq.top();
      d *= -1;
      pq.pop();
      if (vis[node]) {
        continue;
      }
      vis[node] = true;
      for (auto [ch, w, cur_i] : adj[node]) {
        if (cur_i == i) {
          w += add;
        }
        if (ans[ch] > d + w) {
          ans[ch] = d + w;
          pq.push({-ans[ch], ch});
        }
      }
    }
    return ans;
  };

  ll def = sssp(-1, 0)[n];
  ll ans = def;
  ll worst_road = roads[m - 1];
  for (ll i = m - 2; i >= 0; --i) {
    ans = std::max(ans, sssp(i, worst_road)[n]);
    worst_road = std::max(worst_road, roads[i]);
  }
  std::cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...