Raw File
dijkstra.cpp
#include "dijkstra.hpp"

bool cmp(const pair<Weight, Vertex> &x, const pair<Weight, Vertex> &y) {
  return x.first > y.first;
}

void dijkstra(const vector<map<Vertex, Weight>> &adjList,
              vector<Weight> &min_distance, vector<Vertex> &origin,
              Vertex source) {
  min_distance[source] = 0;
  vector<pair<Weight, Vertex>> active_vertices;
  active_vertices.reserve(adjList.size());
  active_vertices.push_back({0, source});
  vector<bool> 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<Vertex, Weight>::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<map<Vertex, Weight>> &adjList,
              vector<Weight> &min_distance, vector<Vertex> &origin,
              set<pair<Weight, Vertex>> &set_active_vertices) {

  vector<pair<Weight, Vertex>> active_vertices;
  active_vertices.reserve(adjList.size());
  active_vertices.insert(active_vertices.begin(), set_active_vertices.begin(),
                         set_active_vertices.end());
  vector<bool> 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<Vertex, Weight>::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<map<Vertex, Weight>> &adjList,
                vector<Weight> &min_distance, vector<Vertex> &origin,
                Vertex source, const vector<int> &terminalsMap, int T) {
  min_distance[source] = 0;
  vector<pair<Weight, Vertex>> active_vertices;
  active_vertices.reserve(adjList.size());
  active_vertices.push_back({0, source});
  vector<bool> 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<Vertex, Weight>::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<map<Vertex, Weight>> &adjList,
                vector<Weight> &min_distance, vector<Vertex> &origin,
                Tree &T,
                set<pair<Weight, Vertex>> &set_active_vertices) {

  vector<pair<Weight, Vertex>> active_vertices;
  active_vertices.reserve(adjList.size());
  active_vertices.insert(active_vertices.begin(), set_active_vertices.begin(),
                         set_active_vertices.end());
  vector<bool> 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<Vertex, Weight>::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<map<Vertex, Weight>> &adjList,
              vector<Weight> &min_distance, vector<Vertex> &origin,
              Vertex source, Vertex target) {
  min_distance[source] = 0;
  vector<pair<Weight, Vertex>> active_vertices;
  active_vertices.reserve(adjList.size());
  active_vertices.push_back({0, source});
  vector<bool> 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<Vertex, Weight>::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<map<Vertex, Weight>> &adjList,
              vector<Weight> &min_distance, vector<Vertex> &origin,
              Vertex source, Vertex v1, Vertex v2) {
  min_distance[source] = 0;
  vector<pair<Weight, Vertex>> active_vertices;
  active_vertices.reserve(adjList.size());
  active_vertices.push_back({0, source});
  vector<bool> 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<Vertex, Weight>::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;
    }
  }
}
back to top