CP-templates

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Misuki743/CP-templates

:heavy_check_mark: graph/shortest_path/Dijkstra.cpp

Verified with

Code

template<integral T>
auto Dijkstra_sparse(vvc<pair<int, T>> &g, vi s) {
  constexpr T INF = numeric_limits<T>::max();
  const int n = ssize(g);

  vc<T> dis(n, INF);
  vi pre(n, -1);
  auto cmp = [](pair<T, int> &a, pair<T, int> &b) { return a.first > b.first; };
  priority_queue<pair<T, int>, vc<pair<T, int>>, decltype(cmp)> pq(cmp, [&]() {
    vc<pair<T, int>> init(size(s));
    for(int i = 0; int v : s) {
      dis[v] = 0, pre[v] = v;
      init[i++] = pair(T(0), v);
    }
    return init;
  }());

  while(!pq.empty()) {
    auto [d, v] = pq.top(); pq.pop();
    if (dis[v] != d) continue;
    for(auto [x, w] : g[v]) {
      if (chmin(dis[x], d + w)) {
        pre[x] = v;
        pq.emplace(dis[x], x);
      }
    }
  }

  return pair(dis, pre);
}

template<integral T>
auto Dijkstra_dense(vvc<T> &adj, vi s) {
  constexpr T INF = numeric_limits<T>::max();
  const int n = ssize(adj);

  vc<T> dis(n, INF);
  vi pre(n, -1);
  for(int v : s)
    dis[v] = 0, pre[v] = v;

  vc<bool> vis(n, false);
  for(int iter = 0; iter < n; iter++) {
    T d = INF;
    int v = -1;
    for(int u = 0; u < n; u++)
      if (!vis[u] and chmin(d, dis[u]))
        v = u;
    if (v == -1) break;
    vis[v] = true;
    for(int x = 0; x < n; x++)
      if (adj[v][x] != INF and chmin(dis[x], dis[v] + adj[v][x]))
        pre[x] = v;
  }

  return pair(dis, pre);
}
#line 1 "graph/shortest_path/Dijkstra.cpp"
template<integral T>
auto Dijkstra_sparse(vvc<pair<int, T>> &g, vi s) {
  constexpr T INF = numeric_limits<T>::max();
  const int n = ssize(g);

  vc<T> dis(n, INF);
  vi pre(n, -1);
  auto cmp = [](pair<T, int> &a, pair<T, int> &b) { return a.first > b.first; };
  priority_queue<pair<T, int>, vc<pair<T, int>>, decltype(cmp)> pq(cmp, [&]() {
    vc<pair<T, int>> init(size(s));
    for(int i = 0; int v : s) {
      dis[v] = 0, pre[v] = v;
      init[i++] = pair(T(0), v);
    }
    return init;
  }());

  while(!pq.empty()) {
    auto [d, v] = pq.top(); pq.pop();
    if (dis[v] != d) continue;
    for(auto [x, w] : g[v]) {
      if (chmin(dis[x], d + w)) {
        pre[x] = v;
        pq.emplace(dis[x], x);
      }
    }
  }

  return pair(dis, pre);
}

template<integral T>
auto Dijkstra_dense(vvc<T> &adj, vi s) {
  constexpr T INF = numeric_limits<T>::max();
  const int n = ssize(adj);

  vc<T> dis(n, INF);
  vi pre(n, -1);
  for(int v : s)
    dis[v] = 0, pre[v] = v;

  vc<bool> vis(n, false);
  for(int iter = 0; iter < n; iter++) {
    T d = INF;
    int v = -1;
    for(int u = 0; u < n; u++)
      if (!vis[u] and chmin(d, dis[u]))
        v = u;
    if (v == -1) break;
    vis[v] = true;
    for(int x = 0; x < n; x++)
      if (adj[v][x] != INF and chmin(dis[x], dis[v] + adj[v][x]))
        pre[x] = v;
  }

  return pair(dis, pre);
}
Back to top page