제출 #1367249

#제출 시각아이디문제언어결과실행 시간메모리
1367249edoCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
25 ms9552 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

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

  int n, m;
  cin >> n >> m;
  int S, T, U, V;
  cin >> S >> T >> U >> V, --S, --T, --U, --V;
  vector<vector<pair<int, ll>>> g(n);
  vector<tuple<int, int, ll>> edg(n);
  for(int i = 0, u, v; i < m; ++i) {
    ll w;
    cin >> u >> v >> w, --u, --v;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
    edg[i] = {u, v, w};
  }

  const ll inf = (1ll << 60);
  auto dijkstra = [&](int src) {
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
    vector<ll> dist(n, inf);
    dist[src] = 0;
    pq.push({0, src});
    while(pq.size()) {
      auto [d, u] = pq.top();
      pq.pop();
      if(d > dist[u]) continue;
      for(auto [v, w] : g[u]) {
        if(dist[v] > dist[u] + w) {
          dist[v] = dist[u] + w;
          pq.push({dist[v], v});
        }
      }
    }
    return dist;
  };

  auto dS = dijkstra(S);
  auto dT = dijkstra(T);
  auto dU = dijkstra(U);
  auto dV = dijkstra(V);

  ll D = dS[T];
  vector<vector<int>> dag(n);
  for(auto [a, b, w] : edg) {
    if(dS[a] + w + dT[b] == D) 
      dag[a].push_back(b);
    if(dS[b] + w + dT[a] == D) 
      dag[b].push_back(a);
  }

  vector<int> ord(n);
  iota(ord.begin(), ord.end(), 0);
  ranges::sort(ord, [&](auto x, auto y) {
        return dS[x] < dS[y];
      });

  auto bestU = dU;
  auto bestV = dV;

  ll ans = inf;
  for(int u : ord) {
    ans = min(ans, bestU[u] + dV[u]);
    ans = min(ans, bestV[u] + dU[u]);
    for(int v : dag[u]) {
      bestU[v] = min(bestU[u], dU[v]);
      bestV[v] = min(bestV[u], dV[v]);
    }
  }
  cout << ans << "\n";
  
  return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…