rcpl

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

View the Project on GitHub ruthen71/rcpl

:heavy_check_mark: Dijkstra's algorithm (ダイクストラ法)
(graph/dijkstra.hpp)

Depends on

Verified with

Code

#pragma once

#include "graph/graph_template.hpp"

template <class T>
std::tuple<std::vector<T>, std::vector<int>, std::vector<int>>  //
dijkstra(Graph<T> &G, std::vector<int> &s, const T INF) {
    int N = (int)G.size();
    std::vector<T> dist(N, INF);
    std::vector<int> par(N, -1), root(N, -1);

    std::priority_queue<std::pair<T, int>, std::vector<std::pair<T, int>>, std::greater<std::pair<T, int>>> que;

    for (auto &v : s) {
        dist[v] = 0;
        root[v] = v;
        que.emplace(T(0), v);
    }

    while (!que.empty()) {
        auto [d, v] = que.top();
        que.pop();
        if (dist[v] != d) continue;  // dist[v] < d
        for (auto &e : G[v]) {
            if (dist[e.to] > d + e.cost) {
                dist[e.to] = d + e.cost;
                root[e.to] = root[v];
                par[e.to] = v;
                que.emplace(dist[e.to], e.to);
            }
        }
    }
    return {dist, par, root};
}
#line 2 "graph/dijkstra.hpp"

#line 2 "graph/graph_template.hpp"

#include <vector>
template <class T> struct Edge {
    int from, to;
    T cost;
    int id;

    Edge() = default;
    Edge(int from, int to, T cost = 1, int id = -1) : from(from), to(to), cost(cost), id(id) {}

    friend std::ostream &operator<<(std::ostream &os, const Edge<T> &e) {
        // output format: "{ id : from -> to, cost }"
        return os << "{ " << e.id << " : " << e.from << " -> " << e.to << ", " << e.cost << " }";
    }
};

template <class T> using Edges = std::vector<Edge<T>>;
template <class T> using Graph = std::vector<std::vector<Edge<T>>>;
#line 4 "graph/dijkstra.hpp"

template <class T>
std::tuple<std::vector<T>, std::vector<int>, std::vector<int>>  //
dijkstra(Graph<T> &G, std::vector<int> &s, const T INF) {
    int N = (int)G.size();
    std::vector<T> dist(N, INF);
    std::vector<int> par(N, -1), root(N, -1);

    std::priority_queue<std::pair<T, int>, std::vector<std::pair<T, int>>, std::greater<std::pair<T, int>>> que;

    for (auto &v : s) {
        dist[v] = 0;
        root[v] = v;
        que.emplace(T(0), v);
    }

    while (!que.empty()) {
        auto [d, v] = que.top();
        que.pop();
        if (dist[v] != d) continue;  // dist[v] < d
        for (auto &e : G[v]) {
            if (dist[e.to] > d + e.cost) {
                dist[e.to] = d + e.cost;
                root[e.to] = root[v];
                par[e.to] = v;
                que.emplace(dist[e.to], e.to);
            }
        }
    }
    return {dist, par, root};
}
Back to top page