Submission #756736

#TimeUsernameProblemLanguageResultExecution timeMemory
756736NeroZeinCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
663 ms38920 KiB
#include "bits/stdc++.h"
#define int long long 
using namespace std;

#ifdef Nero
#include "Deb.h"
#else
#define deb(...)
#endif

using T = pair<int, int>;

const int N = 100005;

int n, m;
int s, t;
int uu, vv;
int cnt;
vector<int> pr[N];
set<pair<int, int>> se; 
vector<pair<int, int>> g[N]; 

vector<int> dijk (int src) {
  cnt++; 
  vector<bool> vis(n + 1, false);
  vector<int> cost(n + 1, 1e16); 
  cost[src] = 0;
  priority_queue<T, vector<T>, greater<T>> pq;
  pq.emplace(0, src);
  while (!pq.empty()) {
    auto [c, v] = pq.top();
    pq.pop();
    if (vis[v] == true) {
      continue;
    }
    vis[v] = true; 
    for (auto [u, w] : g[v]) {
      if (vis[u]) {
        continue;
      }
      if (cnt > 3 && se.count({v, u})) {
        w = 0; 
      } 
      if (c + w < cost[u]) {
        cost[u] = c + w;
        pq.emplace(cost[u], u); 
      }
      if (cnt == 3 && c + w == cost[u]) {
        pr[u].push_back(v); 
      }
    }
  }
  return cost;
}

signed main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n >> m;
  cin >> s >> t;
  cin >> uu >> vv;
  for(int i = 0; i < m; ++i) {
    int u, v, w;
    cin >> u >> v >> w;
    g[u].emplace_back(v, w);
    g[v].emplace_back(u, w);
  }
  auto cuu1 = dijk(uu);
  auto cvv1 = dijk(vv);
  auto cs = dijk(s);
  vector<bool> vis(n + 1); 
  function<void(int)> Dfs = [&](int v) {
    vis[v] = true; 
    for (int u : pr[v]) {
      se.emplace(u, v); 
      if (!vis[u]) {
        Dfs(u);
      }
    }
  }; 
  Dfs(t); 
  auto cuu2 = dijk(uu); 
  auto cvv2 = dijk(vv); 
  int ans = cuu2[vv];
  for (int i = 1; i <= n; ++i) {
    ans = min(ans, cuu1[i] + cvv2[i]); 
    ans = min(ans, cuu2[i] + cvv1[i]); 
  }
  cout << ans << '\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...