제출 #1008963

#제출 시각아이디문제언어결과실행 시간메모리
1008963andecaandeciCommuter Pass (JOI18_commuter_pass)C++17
15 / 100
2059 ms16076 KiB
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
using namespace std;

const int inf = 1e18;

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

  int n, m, a, b, c, d;
  cin >> n >> m >> a >> b >> c >> d;
  vector<vector<pair<int, int>>> adj(n + 5);
  while (m--) {
    int u, v, w;
    cin >> u >> v >> w;
    adj[u].emplace_back(w, v);
    adj[v].emplace_back(w, u);
  }

  /*
  
  dijkstra dari a ke b
  track back jalurnya
  array boolean jalur optimal
  dist[optimal] = min. dari c ke semua optimal
  dijkstra multisource yaitu b dan semua nodes jalur optimal

  kalau cuma ada 1 jalur optimal maka 
  kalau lebih dari 1 jalur optimal maka 
  
  */

  vector<int> dist(n + 5, inf);
  priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

  dist[a] = 0;
  pq.emplace(dist[a], a);

  while (!pq.empty()) {
    int cur = pq.top().se, wei = pq.top().fi;
    pq.pop();

    if (wei > dist[cur]) {
      continue;
    }

    for (auto &i : adj[cur]) {
      if (dist[i.se] > dist[cur] + i.fi) {
        dist[i.se] = dist[cur] + i.fi;
        pq.emplace(dist[i.se], i.se);
      }
    }
  }

  vector<bool> opt(n + 5);
  queue<int> q;
  q.push(b);
  while (!q.empty()) {
    int bre = q.size();
    set<int> st;
    while (bre--) {
      int cur = q.front();
      q.pop();

      opt[cur] = true;

      for (auto &i : adj[cur]) {
        if (dist[cur] == dist[i.se] + i.fi) {
          st.insert(i.se);
        }
      }
      
    }
    for (auto &i : st) {
      q.push(i);
    }
  }

  for (int i = 1; i <= n; ++i) {
    dist[i] = inf;
  }
  dist[c] = 0;
  pq.emplace(dist[c], c);

  while (!pq.empty()) {
    int cur = pq.top().se, wei = pq.top().fi;
    pq.pop();
    
    if (wei > dist[cur]) {
      continue;
    }

    for (auto &i : adj[cur]) {
      if (dist[i.se] > dist[cur] + i.fi) {
        dist[i.se] = dist[cur] + i.fi;
        pq.emplace(dist[i.se], i.se);
      }
    }
  }

  int mn = inf;
  for (int i = 1; i <= n; ++i) {
    if (opt[i]) {
      mn = min(mn, dist[i]);
    }
  }

  for (int i = 1; i <= n; ++i) {
    dist[i] = inf;
  }
  dist[c] = 0;
  pq.emplace(dist[c], c);
  for (int i = 1; i <= n; ++i) {
    if (opt[i]) {
      dist[i] = mn;
      pq.emplace(dist[i], i);
    }
  }

  while (!pq.empty()) {
    int cur = pq.top().se, wei = pq.top().fi;
    pq.pop();

    if (wei > dist[cur]) {
      continue;
    }

    for (auto &i : adj[cur]) {
      if (dist[i.se] > dist[cur] + i.fi) {
        dist[i.se] = dist[cur] + i.fi;
        pq.emplace(dist[i.se], i.se);
      }
    }
  }

  cout << dist[d] << '\n';

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...