#include "dijkstra.hpp" bool cmp(const pair &x, const pair &y) { return x.first > y.first; } void dijkstra(const vector> &adjList, vector &min_distance, vector &origin, Vertex source) { min_distance[source] = 0; vector> active_vertices; active_vertices.reserve(adjList.size()); active_vertices.push_back({0, source}); vector notseen(adjList.size(), true); while (!active_vertices.empty()) { std::pop_heap(active_vertices.begin(), active_vertices.end(), cmp); Vertex where = active_vertices.back().second; active_vertices.pop_back(); if (notseen[where]) { for (std::map::const_iterator it = adjList[where].begin(); it != adjList[where].end(); ++it) if (min_distance[it->first] > min_distance[where] + it->second) { min_distance[it->first] = min_distance[where] + it->second; origin[it->first] = where; active_vertices.push_back({min_distance[it->first], it->first}); push_heap(active_vertices.begin(), active_vertices.end(), cmp); } notseen[where] = false; } } } void dijkstra(const vector> &adjList, vector &min_distance, vector &origin, set> &set_active_vertices) { vector> active_vertices; active_vertices.reserve(adjList.size()); active_vertices.insert(active_vertices.begin(), set_active_vertices.begin(), set_active_vertices.end()); vector notseen(adjList.size(), true); make_heap(active_vertices.begin(), active_vertices.end(), cmp); while (!active_vertices.empty()) { std::pop_heap(active_vertices.begin(), active_vertices.end(), cmp); Vertex where = active_vertices.back().second; active_vertices.pop_back(); if (notseen[where]) { for (std::map::const_iterator it = adjList[where].begin(); it != adjList[where].end(); ++it) if (min_distance[it->first] > min_distance[where] + it->second) { min_distance[it->first] = min_distance[where] + it->second; origin[it->first] = where; active_vertices.push_back({min_distance[it->first], it->first}); push_heap(active_vertices.begin(), active_vertices.end(), cmp); } notseen[where] = false; } } } Vertex dijkstra(const vector> &adjList, vector &min_distance, vector &origin, Vertex source, const vector &terminalsMap, int T) { min_distance[source] = 0; vector> active_vertices; active_vertices.reserve(adjList.size()); active_vertices.push_back({0, source}); vector notseen(adjList.size(), true); while (!active_vertices.empty()) { std::pop_heap(active_vertices.begin(), active_vertices.end(), cmp); Vertex where = active_vertices.back().second; active_vertices.pop_back(); if (notseen[where]) { if (terminalsMap[where] != -1) --T; if (T == 0) return where; for (std::map::const_iterator it = adjList[where].begin(); it != adjList[where].end(); ++it) if (min_distance[it->first] > min_distance[where] + it->second) { min_distance[it->first] = min_distance[where] + it->second; origin[it->first] = where; active_vertices.push_back({min_distance[it->first], it->first}); push_heap(active_vertices.begin(), active_vertices.end(), cmp); } notseen[where] = false; } } return -1; } Vertex dijkstra(const vector> &adjList, vector &min_distance, vector &origin, Tree &T, set> &set_active_vertices) { vector> active_vertices; active_vertices.reserve(adjList.size()); active_vertices.insert(active_vertices.begin(), set_active_vertices.begin(), set_active_vertices.end()); vector notseen(adjList.size(), true); make_heap(active_vertices.begin(), active_vertices.end(), cmp); while (!active_vertices.empty()) { std::pop_heap(active_vertices.begin(), active_vertices.end(), cmp); Vertex where = active_vertices.back().second; active_vertices.pop_back(); if (notseen[where]) { if (T.tree[where].parent > -2) return where; for (std::map::const_iterator it = adjList[where].begin(); it != adjList[where].end(); ++it) if (min_distance[it->first] > min_distance[where] + it->second) { min_distance[it->first] = min_distance[where] + it->second; origin[it->first] = where; active_vertices.push_back({min_distance[it->first], it->first}); push_heap(active_vertices.begin(), active_vertices.end(), cmp); } notseen[where] = false; } } return -1; } void dijkstra(const vector> &adjList, vector &min_distance, vector &origin, Vertex source, Vertex target) { min_distance[source] = 0; vector> active_vertices; active_vertices.reserve(adjList.size()); active_vertices.push_back({0, source}); vector notseen(adjList.size(), true); while (!active_vertices.empty()) { std::pop_heap(active_vertices.begin(), active_vertices.end(), cmp); Vertex where = active_vertices.back().second; active_vertices.pop_back(); if (notseen[where]) { if (where == target) return; for (std::map::const_iterator it = adjList[where].begin(); it != adjList[where].end(); ++it) if (min_distance[it->first] > min_distance[where] + it->second) { min_distance[it->first] = min_distance[where] + it->second; origin[it->first] = where; active_vertices.push_back({min_distance[it->first], it->first}); push_heap(active_vertices.begin(), active_vertices.end(), cmp); } notseen[where] = false; } } } void dijkstra(const vector> &adjList, vector &min_distance, vector &origin, Vertex source, Vertex v1, Vertex v2) { min_distance[source] = 0; vector> active_vertices; active_vertices.reserve(adjList.size()); active_vertices.push_back({0, source}); vector notseen(adjList.size(), true); while (!active_vertices.empty()) { std::pop_heap(active_vertices.begin(), active_vertices.end(), cmp); Vertex where = active_vertices.back().second; active_vertices.pop_back(); if (notseen[where]) { if (where == v1 || where == v2) return; for (std::map::const_iterator it = adjList[where].begin(); it != adjList[where].end(); ++it) if (min_distance[it->first] > min_distance[where] + it->second) { min_distance[it->first] = min_distance[where] + it->second; origin[it->first] = where; active_vertices.push_back({min_distance[it->first], it->first}); push_heap(active_vertices.begin(), active_vertices.end(), cmp); } notseen[where] = false; } } }