Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dijkstra's Algorithm with Priority Queue #27

Merged
merged 2 commits into from
Oct 16, 2019
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Dijkstra Priority Queue using Vector
  • Loading branch information
SAchu47 committed Oct 15, 2019
commit feb687dd8c5b5c82427b6b9eeeb7baae668832b4
85 changes: 85 additions & 0 deletions Algorithms/Graph Algorithms/Dijkstra_priority_queue.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
// Program to find Dijkstra's shortest path using priority_queue with vectors
#include<bits/stdc++.h>
using namespace std;
# define INF 0x3f3f3f3f

// iPair ==> Integer Pair
typedef pair<int, int> iPair;

// To add an edge
void addEdge(vector <pair<int, int> > adj[], int u, int v, int wt)
{
adj[u].push_back(make_pair(v, wt));
adj[v].push_back(make_pair(u, wt));
}


// Prints shortest paths from src to all other vertices
void shortestPath(vector<pair<int,int> > adj[], int V, int src)
{
// Create a priority queue to store vertices that are being preprocessed.
priority_queue< iPair, vector <iPair> , greater<iPair> > pq;

// Create a vector for distances and initialize all distances as infinite (INF)
vector<int> dist(V, INF);

// Insert source itself in priority queue and initialize its distance as 0.
pq.push(make_pair(0, src));
dist[src] = 0;

// Looping till priority queue becomes empty
while (!pq.empty())
{
// The first vertex in pair is the minimum distance vertex, extract it from priority queue. Vertex label is stored in second of pair.
int u = pq.top().second;
pq.pop();

// Get all adjacent of u.
for (auto x : adj[u])
{
// Get vertex label and weight of current adjacent of u.
int v = x.first;
int weight = x.second;

// If there is shorted path to v through u.
if (dist[v] > dist[u] + weight)
{
// Updating distance of v
dist[v] = dist[u] + weight;
pq.push(make_pair(dist[v], v));
}
}
}

// Print shortest distances stored in dist[]
printf("Vertex Distance from Source\n");
for (int i = 0; i < V; ++i)
printf("%d \t\t %d\n", i, dist[i]);
}

// Driver program
int main()
{
int V = 9;
vector<iPair > adj[V];

// making above shown graph
addEdge(adj, 0, 1, 4);
addEdge(adj, 0, 7, 8);
addEdge(adj, 1, 2, 8);
addEdge(adj, 1, 7, 11);
addEdge(adj, 2, 3, 7);
addEdge(adj, 2, 8, 2);
addEdge(adj, 2, 5, 4);
addEdge(adj, 3, 4, 9);
addEdge(adj, 3, 5, 14);
addEdge(adj, 4, 5, 10);
addEdge(adj, 5, 6, 2);
addEdge(adj, 6, 7, 1);
addEdge(adj, 6, 8, 6);
addEdge(adj, 7, 8, 7);

shortestPath(adj, V, 0);

return 0;
}