Skip to content

Commit 163ee2b

Browse files
Merge pull request #362 from Abdullah-Shah-26/feature/dijkstra_algorithm
Feature/dijkstra algorithm
2 parents 21a2d2a + e417bbe commit 163ee2b

1 file changed

Lines changed: 154 additions & 0 deletions

File tree

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
// Dijkstra’s Algorithm — Single Source Shortest Path
2+
// Problem
3+
// Given a weighted graph with non-negative edge weights,
4+
// find the shortest path from a source vertex to all other vertices.
5+
//
6+
// Approach
7+
// 1. Use a priority queue (min-heap) to always expand the next closest vertex.
8+
// 2. Initialize distances[] with infinity, except source = 0.
9+
// 3. While queue not empty:
10+
// - Extract vertex u with smallest dist[u].
11+
// - For each neighbor v of u, relax edge (u,v):
12+
// if dist[u] + weight(u,v) < dist[v], update dist[v].
13+
//
14+
// Complexity
15+
// Time : O((V + E) log V) — using priority queue
16+
// Space : O(V + E) — adjacency list + distance array + heap
17+
//
18+
// Input
19+
// - Number of vertices (V)
20+
// - Number of edges (E)
21+
// - Edge list {u, v, w} (u → v with weight w)
22+
// - Source vertex (src)
23+
//
24+
// Output
25+
// - Shortest distance from src to all vertices
26+
27+
#include <iostream>
28+
#include <vector>
29+
#include <queue>
30+
#include <limits>
31+
using namespace std;
32+
33+
int main()
34+
{
35+
ios::sync_with_stdio(false);
36+
cin.tie(nullptr);
37+
38+
int V, E;
39+
cin >> V >> E;
40+
vector<vector<pair<int, int>>> adj(V);
41+
42+
for (int i = 0; i < E; i++)
43+
{
44+
int u, v, w;
45+
cin >> u >> v >> w;
46+
adj[u].push_back({v, w});
47+
adj[v].push_back({u, w}); // undirected; remove if directed
48+
}
49+
50+
int src;
51+
cin >> src;
52+
53+
const int INF = numeric_limits<int>::max();
54+
vector<int> dist(V, INF);
55+
dist[src] = 0;
56+
57+
// min-heap {distance, vertex}
58+
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
59+
pq.push({0, src});
60+
61+
while (!pq.empty())
62+
{
63+
int d = pq.top().first;
64+
int u = pq.top().second;
65+
pq.pop();
66+
if (d > dist[u])
67+
continue; // outdated entry
68+
69+
for (auto &edge : adj[u])
70+
{
71+
int v = edge.first, w = edge.second;
72+
if (dist[u] + w < dist[v])
73+
{
74+
dist[v] = dist[u] + w;
75+
pq.push({dist[v], v});
76+
}
77+
}
78+
}
79+
80+
cout << "Shortest distances from source " << src << ":\n";
81+
for (int i = 0; i < V; i++)
82+
{
83+
if (dist[i] == INF)
84+
cout << i << " : INF\n";
85+
else
86+
cout << i << " : " << dist[i] << "\n";
87+
}
88+
89+
return 0;
90+
}
91+
92+
/*
93+
Example Input:
94+
5 6
95+
0 1 2
96+
0 2 4
97+
1 2 1
98+
1 3 7
99+
2 4 3
100+
3 4 1
101+
0
102+
103+
Visualization:
104+
Graph:
105+
(2)
106+
0 ------- 1
107+
\ / \
108+
(4)\ (1) (7)
109+
\ / \
110+
2 ------- 3
111+
\ /
112+
(3) (1)
113+
\ /
114+
4
115+
116+
Execution:
117+
dist = [0, INF, INF, INF, INF]
118+
Start from src=0
119+
120+
Step 1: Pick 0 → dist[0]=0
121+
Relax edges:
122+
0→1 (2) → dist[1]=2
123+
0→2 (4) → dist[2]=4
124+
dist = [0,2,4,INF,INF]
125+
126+
Step 2: Pick 1 (dist=2)
127+
Relax edges:
128+
1→2 (1) → dist[2]=min(4,2+1)=3
129+
1→3 (7) → dist[3]=2+7=9
130+
dist = [0,2,3,9,INF]
131+
132+
Step 3: Pick 2 (dist=3)
133+
Relax edges:
134+
2→4 (3) → dist[4]=3+3=6
135+
dist = [0,2,3,9,6]
136+
137+
Step 4: Pick 4 (dist=6) → relax 4→3 (1):
138+
dist[3]=min(9,6+1)=7
139+
dist = [0,2,3,7,6]
140+
141+
Step 5: Pick 3 (dist=7) → no better updates
142+
143+
Final distances from 0:
144+
0 : 0
145+
1 : 2
146+
2 : 3
147+
3 : 7
148+
4 : 6
149+
150+
Time : O((V+E) log V)
151+
Space : O(V+E)
152+
*/
153+
154+
// add: Dijkstra PR

0 commit comments

Comments
 (0)