Dijkstra Shortest PathΒΆ

Note

Tested on: URI1148

#include <functional> // greater
#include <vector>     // vector
#include <queue>      // priority_queue
#include <limits>     // numeric_limits
#include <utility>    // pair
#include <algorithm>  // fill

using namespace std;

#define MAX 1000

using ii = pair<int, int>;

vector<ii> G[MAX]; // Adjacent list with elements == (weight, node)

int dijkstra_sssp(int source_node, int target_node, int N)
{
    /*
        Finds the shortest path in a weighted graph

        Complexity: O((V + E) log(V))
    */

    // Initially all distances are infinity
    int distances[MAX];
    fill(distances, distances + N + 1, numeric_limits<int>::max());

    // The distance to the source_node is always 0
    distances[source_node] = 0;

    priority_queue<ii, vector<ii>, greater<ii> > to_visit;
    to_visit.push(ii(distances[source_node], source_node));

    while(!to_visit.empty())
    {
        auto distance = to_visit.top().first;
        auto node     = to_visit.top().second;
        to_visit.pop();

        // If a smaller distance were already found, skip the current one
        if(distance > distances[node]) continue;

        for(auto adjacent: G[node])
        {
            auto dist = adjacent.first;
            auto adj  = adjacent.second;

            // current node distance + edge weight < adjacent node distance
            if(distances[node] + dist < distances[adj])
            {
                // Update with smaller distance
                distances[adj] = distances[node] + dist;
                to_visit.push(ii(distances[adj], adj));
            }
        }
    }

    return distances[target_node];
}