If these ideas are new, begin with:
Understand the idea
Connected components partition an undirected graph into maximal reachable groups. Start a traversal at each unvisited vertex and count starts. Directed strong and weak connectivity are different concepts.
Work through an example
The lab has one A-B-C-D component and isolated E, so count=2. A single BFS from A cannot discover E.
Time and space complexity
O(V+E) time/O(V) state over the whole graph, not one full traversal per vertex.
Why it works
After each traversal, seen contains every vertex of that completed component.
Common mistakes
- Ignoring isolated vertices undercounts.
- Directed reachability is not automatically a component equivalence.
Chapter lab · Python implementation
A graph models entities and connections; edges can be directed or undirected, weighted or unweighted. Our lab uses adjacency lists and marks BFS vertices when enqueuing. The diagram has a cycle A-B-D-C-A, so visited state is essential. Distances count edges because every edge has equal cost.
This shared lab connects the chapter's topics. Follow the current lesson's worked example first, then trace the complete implementation. Additional algorithms described in topic exercises are variations you can implement independently.
from collections import deque
def bfs(graph,start):
distances={start:0}
parent={start:None}
queue=deque([start])
while queue:
node=queue.popleft()
for neighbor in graph.get(node,[]):
if neighbor not in distances:
distances[neighbor]=distances[node]+1
parent[neighbor]=node
queue.append(neighbor)
return distances,parent
def components(graph):
seen=set(); count=0
for start in graph:
if start in seen: continue
count+=1; seen.add(start); stack=[start]
while stack:
node=stack.pop()
for neighbor in graph[node]:
if neighbor not in seen:
seen.add(neighbor); stack.append(neighbor)
return countRun and test the lab
Copy the implementation and these assertions into a Python 3 file and run it. An assertion failure means the actual result differs from the expectation. Add the current topic's exercise and boundary tests to deepen your understanding.
g={'A':['B','C'],'B':['A','D'],'C':['A','D'],'D':['B','C'],'E':[]}
d,p=bfs(g,'A'); assert d=={'A':0,'B':1,'C':1,'D':2}
assert p['D'] in ['B','C']
assert components(g)==2
assert bfs({'X':[]},'X')[0]=={'X':0}