from collections import deque def kahn_topological_sort(graph): indegree = {node: 0 for node in graph} for node in graph: for neighbor in graph[node]: indegree[neighbor] += 1 queue = deque([node for node in indegree if indegree[node] == 0]) topo_order = [] while queue: current = queue.popleft() topo_order.append(current) for neighbor in graph[current]: indegree[neighbor] -= 1 if indegree[neighbor] == 0: queue.append(neighbor) if len(topo_order) == len(graph): return topo_order else: return [] graph = { 'A': ['C'], 'B': ['C', 'D'], 'C': ['E'], 'D': ['F'], 'E': ['H', 'F'], 'F': ['G'], 'G': [], 'H': [] } print(kahn_topological_sort(graph))
Kahn's Algorithm starts with nodes having zero indegree. Here, 'A' and 'B' start first. Then their neighbors are processed in order, maintaining the topological order. The output is a valid topological sort respecting dependencies.
Indegree counts how many edges come into a node. Nodes with zero indegree have no dependencies and can be processed first.
from collections import deque def kahn_topological_sort(graph): indegree = {node: 0 for node in graph} for node in graph: for neighbor in graph[node]: indegree[neighbor] += 1 queue = deque([node for node in indegree if indegree[node] == 0]) topo_order = [] while queue: current = queue.popleft() topo_order.append(current) for neighbor in graph[current]: indegree[neighbor] -= 1 if indegree[neighbor] == 0: queue.append(neighbor) if len(topo_order) == len(graph): return topo_order else: return "Cycle detected" graph = { 'A': ['B'], 'B': ['C'], 'C': ['A'] } print(kahn_topological_sort(graph))
The graph has a cycle, so no node has zero indegree. The queue is empty, so topo_order remains empty. The function returns "Cycle detected".
graph = {
'X': ['Y', 'Z'],
'Y': ['W'],
'Z': ['W'],
'W': []
}X must come before Y and Z, and both Y and Z before W. Y and Z can be ordered in 2 ways (Y then Z, or Z then Y). Total valid orders: 2.
from collections import deque def kahn_topological_sort(graph): indegree = {node: 0 for node in graph} for node in graph: for neighbor in graph[node]: indegree[neighbor] += 1 queue = deque([node for node in indegree if indegree[node] == 0]) topo_order = [] while queue current = queue.popleft() topo_order.append(current) for neighbor in graph[current]: indegree[neighbor] -= 1 if indegree[neighbor] == 0: queue.append(neighbor) if len(topo_order) == len(graph): return topo_order else: return []
The 'while queue' line is missing a colon at the end, which causes a SyntaxError.
