Dijkstra's Algorithm
Dijkstra's Algorithm is used to find the shortest path from a source node to all other nodes in a weighted graph, where all edge weights are non-negative. It is widely used in network routing and GPS applications.
Key Features:ā
- Time Complexity: O(VĀ²) for a simple implementation with an adjacency matrix, or O(E log V) using a priority queue (min-heap).
- Space Complexity: O(V), where V is the number of vertices.
- Suitable for graphs with non-negative edge weights.
Applications:ā
- Shortest path calculations in GPS and network routing.
- Optimal path planning in games and simulations.
- Analyzing transportation or logistics networks.
Code in C
#include <stdio.h>
#include <limits.h>
#define V 5
int minDistance(int dist[], int sptSet[]) {
int min = INT_MAX, min_index;
for (int v = 0; v < V; v++)
if (sptSet[v] == 0 && dist[v] <= min)
min = dist[v], min_index = v;
return min_index;
}
void dijkstra(int graph[V][V], int src) {
int dist[V];
int sptSet[V] = {0};
for (int i = 0; i < V; i++)
dist[i] = INT_MAX;
dist[src] = 0;
for (int count = 0; count < V - 1; count++) {
int u = minDistance(dist, sptSet);
sptSet[u] = 1;
for (int v = 0; v < V; v++)
if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX
&& dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
printf("Vertex\tDistance from Source\n");
for (int i = 0; i < V; i++)
printf("%d\t%d\n", i, dist[i]);
}
int main() {
int graph[V][V];
int src;
printf("Enter the adjacency matrix (use 0 for no direct connection):\n");
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
scanf("%d", &graph[i][j]);
}
}
printf("Enter the source vertex: ");
scanf("%d", &src);
dijkstra(graph, src);
return 0;
}
Code in Cpp
#include <iostream>
#include <vector>
#include <queue>
#include <limits.h>
using namespace std;
void dijkstra(vector<vector<int>>& graph, int src, int V) {
vector<int> dist(V, INT_MAX);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
dist[src] = 0;
pq.push({0, src});
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
for (int v = 0; v < V; v++) {
if (graph[u][v] && dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
pq.push({dist[v], v});
}
}
}
cout << "Vertex\tDistance from Source\n";
for (int i = 0; i < V; i++)
cout << i << "\t" << dist[i] << "\n";
}
int main() {
int V;
cout << "Enter the number of vertices: ";
cin >> V;
vector<vector<int>> graph(V, vector<int>(V));
cout << "Enter the adjacency matrix (use 0 for no direct connection):\n";
for (int i = 0; i < V; i++)
for (int j = 0; j < V; j++)
cin >> graph[i][j];
int src;
cout << "Enter the source vertex: ";
cin >> src;
dijkstra(graph, src, V);
return 0;
}
Code in Python
import heapq
def dijkstra(graph, src, V):
dist = [float("inf")] * V
dist[src] = 0
min_heap = [(0, src)]
while min_heap:
current_distance, u = heapq.heappop(min_heap)
for v in range(V):
if graph[u][v] > 0 and current_distance + graph[u][v] < dist[v]:
dist[v] = current_distance + graph[u][v]
heapq.heappush(min_heap, (dist[v], v))
print("Vertex\tDistance from Source")
for i in range(V):
print(f"{i}\t{dist[i]}")
V = int(input("Enter the number of vertices: "))
graph = []
print("Enter the adjacency matrix (use 0 for no direct connection):")
for i in range(V):
graph.append(list(map(int, input().split())))
src = int(input("Enter the source vertex: "))
dijkstra(graph, src, V)
Code in Java
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Dijkstra {
public static void dijkstra(int[][] graph, int src, int V) {
int[] dist = new int[V];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[src] = 0;
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[1] - b[1]);
pq.add(new int[]{src, 0});
while (!pq.isEmpty()) {
int[] current = pq.poll();
int u = current[0];
for (int v = 0; v < V; v++) {
if (graph[u][v] > 0 && dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
pq.add(new int[]{v, dist[v]});
}
}
}
System.out.println("Vertex\tDistance from Source");
for (int i = 0; i < V; i++) {
System.out.println(i + "\t" + dist[i]);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter the number of vertices: ");
int V = sc.nextInt();
int[][] graph = new int[V][V];
System.out.println("Enter the adjacency matrix (use 0 for no direct connection):");
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
graph[i][j] = sc.nextInt();
}
}
System.out.print("Enter the source vertex: ");
int src = sc.nextInt();
dijkstra(graph, src, V);
}
}
Example:ā
Input:ā
Enter the number of vertices: 5
Enter the adjacency matrix (use 0 for no direct connection):
0 10 20 0 0
10 0 30 50 10
20 30 0 20 0
0 50 20 0 20
0 10 0 20 0
Enter the source vertex: 0
Output:ā
Vertex Distance from Source
0 0
1 10
2 20
3 40
4 20