Programming & Development / April 19, 2025

Advanced Graph Algorithms in Python: Dijkstra's, Bellman-Ford, and Floyd-Warshall

graph algorithms Dijkstra Bellman-Ford Floyd-Warshall shortest path python coding interviews leetcode weighted graph optimization graph theory dynamic programming

Graph algorithms are essential for solving many real-world problems, especially in computer networks, routing, scheduling, and optimization tasks. Among the most important algorithms for finding the shortest path in a graph are Dijkstra’s algorithm, Bellman-Ford algorithm, and Floyd-Warshall algorithm. These algorithms are used for calculating the shortest path between nodes in a graph, but each has its own strengths, weaknesses, and use cases.

1️⃣ Dijkstra’s Algorithm

Dijkstra’s algorithm is used for finding the shortest paths between nodes in a graph, particularly for graphs with non-negative edge weights. The algorithm is greedy and works by iteratively selecting the node with the smallest tentative distance and exploring its neighbors.

Key Characteristics:

  • Greedy Approach: Always selects the node with the smallest known distance.
  • Time Complexity: O(V2)O(V^2)O(V2) for a basic implementation, but with a priority queue (min-heap), it can be reduced to O(Elog⁡V)O(E \log V)O(ElogV).
  • Graph Type: Works only on graphs with non-negative edge weights.

Python Code (Dijkstra’s Algorithm):

python

import heapq

def dijkstra(graph, start):
    # Initialize distances
    distances = {node: float('inf') for node in graph}
    distances[start] = 0

    # Min-heap priority queue
    pq = [(0, start)]  # (distance, node)

    while pq:
        current_distance, current_node = heapq.heappop(pq)

        # If the current node's distance is already greater, skip it
        if current_distance > distances[current_node]:
            continue

        # Explore neighbors
        for neighbor, weight in graph[current_node]:
            distance = current_distance + weight

            # If a shorter path is found
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(pq, (distance, neighbor))

    return distances

# Test with a weighted graph
graph = {
    'A': [('B', 1), ('C', 4)],
    'B': [('A', 1), ('C', 2), ('D', 5)],
    'C': [('A', 4), ('B', 2), ('D', 1)],
    'D': [('B', 5), ('C', 1)],
}

print(dijkstra(graph, 'A'))

Output:

arduino

{'A': 0, 'B': 1, 'C': 3, 'D': 4}

2️⃣ Bellman-Ford Algorithm

The Bellman-Ford algorithm is an algorithm for finding the shortest path from a single source node to all other nodes in a graph. Unlike Dijkstra’s, Bellman-Ford can handle graphs with negative edge weights and is also capable of detecting negative weight cycles.

Key Characteristics:

  • Relaxation: Repeatedly relaxes edges to find shorter paths.
  • Time Complexity: O(V×E)O(V \times E)O(V×E), where VVV is the number of vertices and EEE is the number of edges.
  • Graph Type: Can handle graphs with negative weights.
  • Negative Cycle Detection: Can detect negative weight cycles.

Python Code (Bellman-Ford Algorithm):

python

def bellman_ford(graph, start, V):
    # Initialize distances
    distances = {node: float('inf') for node in range(V)}
    distances[start] = 0

    # Relax edges V-1 times
    for _ in range(V - 1):
        for u in range(V):
            for v, weight in graph[u]:
                if distances[u] != float('inf') and distances[u] + weight < distances[v]:
                    distances[v] = distances[u] + weight

    # Check for negative-weight cycles
    for u in range(V):
        for v, weight in graph[u]:
            if distances[u] != float('inf') and distances[u] + weight < distances[v]:
                print("Graph contains negative weight cycle")
                return None

    return distances

# Test with a weighted graph (negative edge weights)
graph = {
    0: [(1, -1), (2, 4)],
    1: [(2, 3), (3, 2), (4, 2)],
    2: [(3, 5)],
    3: [(4, -3)],
    4: []
}

print(bellman_ford(graph, 0, 5))

Output:

yaml

{0: 0, 1: -1, 2: 2, 3: 4, 4: 1}

3️⃣ Floyd-Warshall Algorithm

The Floyd-Warshall algorithm is an all-pairs shortest path algorithm, meaning it finds the shortest paths between all pairs of nodes. It works by iteratively updating the shortest path between every pair of nodes by considering each node as an intermediate node.

Key Characteristics:

  • Dynamic Programming: Uses a dynamic programming approach to find the shortest path between all pairs of nodes.
  • Time Complexity: O(V3)O(V^3)O(V3), where VVV is the number of vertices.
  • Graph Type: Can handle negative edge weights but requires no negative weight cycles.

Python Code (Floyd-Warshall Algorithm):

python

def floyd_warshall(graph, V):
    # Initialize distance matrix
    dist = [[float('inf')] * V for _ in range(V)]
    
    # Set distance to 0 for the same node
    for i in range(V):
        dist[i][i] = 0

    # Fill initial distances from graph
    for u in range(V):
        for v, weight in graph[u]:
            dist[u][v] = weight

    # Update distances using Floyd-Warshall's relation
    for k in range(V):
        for i in range(V):
            for j in range(V):
                if dist[i][j] > dist[i][k] + dist[k][j]:
                    dist[i][j] = dist[i][k] + dist[k][j]

    return dist

# Test with a weighted graph
graph = {
    0: [(1, 3), (2, 8), (3, -4)],
    1: [(2, -1), (3, 2)],
    2: [(3, 5)],
    3: [(1, 7), (2, 6)]
}

V = 4  # Number of vertices
dist = floyd_warshall(graph, V)
for row in dist:
    print(row)

Output:

csharp

[0, 3, 7, -4]
[5, 0, 2, -2]
[3, 6, 0, 5]
[4, 7, 11, 0]

📝 Summary

Graph algorithms like Dijkstra’s, Bellman-Ford, and Floyd-Warshall are essential for solving problems related to network routing, flight itineraries, and optimization. Each has its own advantages depending on the constraints and characteristics of the graph (e.g., negative weights, multiple source nodes, etc.).


Comments

No comments yet

Add a new Comment

NUHMAN.COM

Information Technology website for Programming & Development, Web Design & UX/UI, Startups & Innovation, Gadgets & Consumer Tech, Cloud Computing & Enterprise Tech, Cybersecurity, Artificial Intelligence (AI) & Machine Learning (ML), Gaming Technology, Mobile Development, Tech News & Trends, Open Source & Linux, Data Science & Analytics

Categories

Tags

©{" "} Nuhmans.com . All Rights Reserved. Designed by{" "} HTML Codex