| # | Likes | Tech tags | Title | Creator | Created date | 
|---|---|---|---|---|---|
| 1 | 0 | 
                    2022-07-30 01:54
                  | 
            
An \(O(|E| + |V| \log |V|)\) algorithm that finds the distance from the starting vertex on a weighted graph (\(|V|\) is no. of vertices, \(|E|\) is no. of edges). Implemented for integer edge weights, but can be trivially adapted to account for floating-point edge weights.
#include<vector>
#include<deque>
#include<tuple>
#include<queue>
struct DijkstraGraph {
    struct Node;
    struct Arc {
        Node* dest;
        int l;
    };
    struct Node {
        std::vector<Arc> arc;
        bool explr = false;
        long long dist;
    };
    std::deque<Node> nodes;
    
    Node* add_node() {
        nodes.push_back(Node());
        return &nodes.back();
    }
    void add_edge(Node* u, Node* v, int l) {
        u->arc.push_back({v, l});
    }
    
    void dijkstra(Node* start) {
        std::priority_queue<std::pair<long long, Node*> > frontier;
        frontier.push({0, start});
        
        while(frontier.size() > 0) {
            long long potential;
            Node* cur;
            std::tie(potential, cur) = frontier.top();
            potential = -potential;
            frontier.pop();
            
            if(!cur->explr) {
                cur->explr = true;
                cur->dist = potential;
                
                for(Arc curArc : cur->arc) {
                    // priority_queue is a max-heap, so for convenience we use the negative of potential instead of
                    // defining a custom ordering function
                    frontier.push({-potential - curArc.l, curArc.dest});
                }
            }
        }
    }
};
int main() {
    DijkstraGraph graph;
    
    graph.add_node();
    graph.add_node();
    graph.add_edge(&graph.nodes[0], &graph.nodes[1], 5);
    // ...
    // Populate the graph with add_node and add_edge
    
    graph.dijkstra(&graph.nodes[0]); // Assumes node 0 is where we start the search
}
Basic Graph Algorithms: Dijkstra's algorithm - courses.cs.ut.ee
Dijkstra's algorithm - wikipedia.org
| classes | ||
std::deque | 
en.cppreference.com | cplusplus.com | 
std::pair | 
en.cppreference.com | cplusplus.com | 
std::priority_queue | 
en.cppreference.com | cplusplus.com | 
std::vector | 
en.cppreference.com | cplusplus.com | 
| functions | ||
std::deque::push_back | 
en.cppreference.com | cplusplus.com | 
std::pair::pair | 
en.cppreference.com | cplusplus.com | 
std::priority_queue::pop | 
en.cppreference.com | cplusplus.com | 
std::priority_queue::push | 
en.cppreference.com | cplusplus.com | 
std::priority_queue::top | 
en.cppreference.com | cplusplus.com | 
std::tie | 
en.cppreference.com | cplusplus.com | 
std::vector::push_back | 
en.cppreference.com | cplusplus.com | 
Construct a weighted directed graph and perform Dijkstra's shortest path algorithm on it. Calculate the distance of each node from the starting vertex of the search.