Tech Blogs
  • Vivek bhargav
  • Books
    • Seven Databases In Seven Weeks
      • Factors to consider
      • Genres of databases
      • Important questions
      • PostGreSQL
  • Tech
    • C++
      • Type Conversions
      • String
      • Vector
      • Set
      • Unordered Set
      • Map
      • Unordered Map
      • Queue
      • Priority Queue
      • Union find
      • Algorithms
      • Matrix to Graph
      • Trie
      • Dijkstra
      • Math
      • Utils
    • Database Transactions
      • A Simple Transaction Analysis
      • Implementation of Isolation Levels
      • Isolation Levels
      • Isolation
      • Storage Types
      • Transaction Atomicity and Durability
    • Java
      • Important Questions
      • Spring MVC
    • Program execution
      • Node.js
      • Runtimes
    • System Design
      • Basic Terminologies
      • CAP Theorem
      • Normalization of Database
      • Useful Reads
  • Personal Finance
    • Asset Classes
      • Equity instruments
      • Debt instruments
Powered by GitBook
On this page
  1. Tech
  2. C++

Dijkstra

/**
 * Dijkstra's algorithm. 
 * In essence, Dijkstra's algorithm maintains two sets: one set of nodes whose
 * distance from source is NOT finalized, one set of nodes whose distance
 * from source IS finalized. 
 * In implementation, we keep track of the two sets explicitly or implicitly. 
 * 
 * https://leetcode.com/problems/path-with-maximum-probability/solutions/732293/dijkstras-algorithm-implementation-c/
 * 
 */

#include <iostream>
#include <vector>
#include <queue>
#include <set>

using namespace std;

// Helper functions
vector<vector<pair<int, int>>> buildGraph(int n, vector<vector<int>>& edges, vector<int>& weights) {
    vector<vector<pair<int, int>>> graph(n);
    for (int i = 0; i < edges.size(); i++) {
        vector<int> edge = edges[i];
        graph[edge[0]].push_back({edge[1], weights[i]});
        graph[edge[1]].push_back({edge[0], weights[i]});
    }
    return graph;
}

void printSolution(vector<int>& dist) {
    printf("Vertex \tDistance from Source\n");
    for (int i = 0; i < dist.size(); i++)
        printf("  %d \t\t\t %d\n", i, dist[i]);

    cout << "\n\n" << endl;
}

class Solution {
   public:

    vector<int> getShortestPathsUsingDijkstraUsingPrioirityQueue(vector<vector<pair<int, int>>>& graph, int src) {
        
        int n = graph.size();
        
        vector<int> dist(n, INT_MAX);



        auto comp = [](const pair<int, int>& p1, const pair<int, int>& p2) {
            // pair<distance, node> => this pair is different from pair in the graph.
            // This pair is an entry in the priority_queue
            return p1.first > p2.first; 
        };
        priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> unfinalized(comp);


        
        dist[src] = 0;
        unfinalized.push({0, src});



        while (!unfinalized.empty()) {
            int u = unfinalized.top().second;
            unfinalized.pop();

            for (int i = 0; i < graph[u].size(); i++) {
                int v = graph[u][i].first, weight = graph[u][i].second;
                if (dist[u] + weight < dist[v]) {
                    dist[v] = dist[u] + weight;
                    unfinalized.push({dist[v], v});
                }
            }
        }

        return dist;
    }
};

int main() {
    Solution sol;
    int n = 9;

    vector<vector<int>> edges({{0, 1},
                               {0, 7},
                               {1, 2},
                               {1, 7},
                               {2, 3},
                               {2, 8},
                               {2, 5},
                               {3, 4},
                               {3, 5},
                               {4, 5},
                               {5, 6},
                               {6, 7},
                               {6, 8},
                               {7, 8}});
    vector<int> weights({4, 8, 8, 11, 7, 2, 4, 9, 14, 10, 2, 1, 6, 7});

    vector<vector<pair<int, int>>> graph = buildGraph(n, edges, weights);

    // adjacency list, with C++ priority_queue
    vector<int> dist = sol.getShortestPathsUsingDijkstraUsingPrioirityQueue(graph, 0);

    printSolution(dist);

}
PreviousTrieNextMath

Last updated 2 years ago