제출 #1311563

#제출 시각아이디문제언어결과실행 시간메모리
1311563mioCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
174 ms16300 KiB
// #include <dbg.h>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
using ull = unsigned long long;
template <typename T> using vstack = stack<T, vector<T>>;

struct Edge2 {
  uint a, b;
};
struct Edge {
  uint b;
  ull c;
};
auto djikstra(vector<ull> &dst, uint u, const auto &edges) {
  vstack<pair<ull, uint>> st;
  dst[u] = 0;
  st.push({0, u});
  while (!st.empty()) {
    auto [d, v] = st.top();
    st.pop();
    dst[v] = d;
    for (Edge edge : edges[v]) {
      if (dst[edge.b] > d + edge.c) {
        dst[edge.b] = d + edge.c;
        st.push({dst[edge.b], d + edge.c});
      }
    }
  }
}

int main() {
  uint n, m;
  cin >> n >> m;
  uint s, t;
  cin >> s >> t;
  s--;
  t--;
  uint u, v;
  cin >> u >> v;
  u--;
  v--;
  vector<vector<Edge>> edges(n);
  for (uint i = 0; i < m; i++) {
    uint a, b;
    ull c;
    cin >> a >> b >> c;
    a--;
    b--;
    edges[a].push_back({b, c});
    edges[b].push_back({a, c});
  }
  vector<bool> special(n, false);
  vector<uint> order;
  order.reserve(n);
  // Djikstra
  vector<vector<uint>> prev(n);
  vector<ull> dst(n, -1ull);
  vstack<pair<ull, uint>> st;
  dst[s] = 0;
  st.push({0, s});
  while (!st.empty()) {
    auto [d, v] = st.top();
    st.pop();
    order.push_back(v);
    dst[v] = d;
    for (Edge edge : edges[v]) {
      if (dst[edge.b] > d + edge.c) {
        dst[edge.b] = d + edge.c;
        st.push({dst[edge.b], d + edge.c});
        prev[edge.b].assign(1, v);
      } else if (dst[edge.b] == d + edge.c) {
        prev[edge.b].push_back(v);
      }
    }
  }
  vstack<uint> to_v;
  to_v.push(t);
  while (!to_v.empty()) {
    uint v = to_v.top();
    to_v.pop();
    special[v] = true;
    for (uint p : prev[v]) {
      to_v.push(p);
    }
  }
  vector<ull> dst_u(n, -1ull);
  djikstra(dst_u, u, edges);
  vector<ull> dst_v(n, -1ull);
  djikstra(dst_v, v, edges);
  ull best_dst = -1ull;
  vector<ull> disc_dst;
  for (bool do_s : {false, true}) {
    if (do_s) {
      swap(dst_u, dst_v);
      swap(u, v);
    }
    disc_dst.assign(n, -1ull);
    for (uint v : order) {
      disc_dst[v] = dst_u[v];
      for (uint p : prev[v]) {
        disc_dst[v] = min(disc_dst[v], disc_dst[p]);
      }
      best_dst = min(best_dst, disc_dst[v] + dst_v[v]);
    }
  }
  cout << best_dst << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...