This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
/**
* @note O((E + V) log V)
*/
vector<ll> dijkstra(vector<vector<pair<int, ll> > > const & g, int root) {
vector<ll> dist(g.size(), LLONG_MAX);
priority_queue<pair<ll, int> > que;
dist[root] = 0;
que.emplace(- dist[root], root);
while (not que.empty()) {
ll dist_i; int i; tie(dist_i, i) = que.top(); que.pop();
if (dist[i] < - dist_i) continue;
for (auto it : g[i]) {
int j; ll cost; tie(j, cost) = it;
if (- dist_i + cost < dist[j]) {
dist[j] = - dist_i + cost;
que.emplace(dist_i - cost, j);
}
}
}
return dist;
}
template <typename T>
vector<T> original_dijkstra(vector<vector<pair<int, T> > > const & g, int start, T inf) { // O(V^2)
int n = g.size();
vector<double> dist(n, inf);
vector<int> ixs(n); whole(iota, ixs, 0);
dist[start] = 0;
repeat (loop,n) {
int i; {
auto it = whole(min_element, ixs, [&](int i, int j) { return dist[i] < dist[j]; });
i = *it;
*it = ixs.back();
ixs.pop_back();
}
for (auto it : g[i]) {
int j; T cost; tie(j, cost) = it;
setmin(dist[j], dist[i] + cost);
}
}
return dist;
}
/**
* @note generic one
*/
template <class T, class Func>
vector<T> run_dijkstra(int n, int src, Func iterate) {
vector<T> dist(n, numeric_limits<T>::max());
priority_queue<pair<T, int> > que;
dist[src] = 0;
que.emplace(- dist[src], src);
while (not que.empty()) {
T dist_i; int i; tie(dist_i, i) = que.top(); que.pop();
if (dist[i] < - dist_i) continue;
iterate(i, [&](int j, T cost) {
if (- dist_i + cost < dist[j]) {
dist[j] = - dist_i + cost;
que.emplace(dist_i - cost, j);
}
});
}
return dist;
}
template <class T, class Func>
vector<int> reconstruct_dijkstra(int n, int src, int dst, vector<T> const & dist, Func iterate) {
}
template <class T, class Func>
vector<int> reconstruct_edges_dijkstra(int n, int src, int dst, vector<T> const & dist, Func iterate) {
vector<int> edges;
int i = dst;
while (i != src) {
int next = -1;
int next_edge = -1;
iterate(i, [&](int j, int edge, T cost) {
if (dist[i] == dist[j] + cost) {
next = j;
next_edge = edge;
}
});
assert (next != -1);
i = next;
edges.push_back(next_edge);
}
reverse(ALL(edges));
return edges;
}
#line 1 "old/dijkstra.inc.cpp"
/**
* @note O((E + V) log V)
*/
vector<ll> dijkstra(vector<vector<pair<int, ll> > > const & g, int root) {
vector<ll> dist(g.size(), LLONG_MAX);
priority_queue<pair<ll, int> > que;
dist[root] = 0;
que.emplace(- dist[root], root);
while (not que.empty()) {
ll dist_i; int i; tie(dist_i, i) = que.top(); que.pop();
if (dist[i] < - dist_i) continue;
for (auto it : g[i]) {
int j; ll cost; tie(j, cost) = it;
if (- dist_i + cost < dist[j]) {
dist[j] = - dist_i + cost;
que.emplace(dist_i - cost, j);
}
}
}
return dist;
}
template <typename T>
vector<T> original_dijkstra(vector<vector<pair<int, T> > > const & g, int start, T inf) { // O(V^2)
int n = g.size();
vector<double> dist(n, inf);
vector<int> ixs(n); whole(iota, ixs, 0);
dist[start] = 0;
repeat (loop,n) {
int i; {
auto it = whole(min_element, ixs, [&](int i, int j) { return dist[i] < dist[j]; });
i = *it;
*it = ixs.back();
ixs.pop_back();
}
for (auto it : g[i]) {
int j; T cost; tie(j, cost) = it;
setmin(dist[j], dist[i] + cost);
}
}
return dist;
}
/**
* @note generic one
*/
template <class T, class Func>
vector<T> run_dijkstra(int n, int src, Func iterate) {
vector<T> dist(n, numeric_limits<T>::max());
priority_queue<pair<T, int> > que;
dist[src] = 0;
que.emplace(- dist[src], src);
while (not que.empty()) {
T dist_i; int i; tie(dist_i, i) = que.top(); que.pop();
if (dist[i] < - dist_i) continue;
iterate(i, [&](int j, T cost) {
if (- dist_i + cost < dist[j]) {
dist[j] = - dist_i + cost;
que.emplace(dist_i - cost, j);
}
});
}
return dist;
}
template <class T, class Func>
vector<int> reconstruct_dijkstra(int n, int src, int dst, vector<T> const & dist, Func iterate) {
}
template <class T, class Func>
vector<int> reconstruct_edges_dijkstra(int n, int src, int dst, vector<T> const & dist, Func iterate) {
vector<int> edges;
int i = dst;
while (i != src) {
int next = -1;
int next_edge = -1;
iterate(i, [&](int j, int edge, T cost) {
if (dist[i] == dist[j] + cost) {
next = j;
next_edge = edge;
}
});
assert (next != -1);
i = next;
edges.push_back(next_edge);
}
reverse(ALL(edges));
return edges;
}