Implement BFS to Find Shortest Path in Graph
Company: Amazon
Role: Data Scientist
Category: Coding & Algorithms
Difficulty: Medium
Interview Round: Technical Screen
Quick Answer: This question evaluates understanding of graph traversal algorithms, particularly breadth-first search, and competency in computing shortest paths and reconstructing an example shortest route in large undirected graphs.
Constraints
- 1 <= n <= 200000
- 0 <= len(edges) <= 400000
- 0 <= u, v < n for every edge [u, v]
- 0 <= source, target < n
- Graph is undirected and may be disconnected
- Implement iterative BFS using a queue (no recursion)
- Return one shortest path; if none exists, return distance -1 and empty path
Solution
from collections import deque
def shortest_friend_path(n, edges, source, target):
# Trivial case
if source == target:
return {"distance": 0, "path": [source]}
# Build adjacency list
adj = [[] for _ in range(n)]
for e in edges:
if not isinstance(e, (list, tuple)) or len(e) != 2:
continue
u, v = e
if not isinstance(u, int) or not isinstance(v, int):
continue
if not (0 <= u < n and 0 <= v < n):
continue
adj[u].append(v)
if u != v: # avoid duplicating self-loop
adj[v].append(u)
visited = [False] * n
parent = [-1] * n
dq = deque([source])
visited[source] = True
while dq:
u = dq.popleft()
for v in adj[u]:
if not visited[v]:
visited[v] = True
parent[v] = u
if v == target: # early exit upon discovery
# Reconstruct path from target to source via parents
path = [v]
while path[-1] != source:
path.append(parent[path[-1]])
path.reverse()
return {"distance": len(path) - 1, "path": path}
dq.append(v)
return {"distance": -1, "path": []}Explanation
Time complexity: O(n + m), where n is the number of nodes and m is the number of edges. Space complexity: O(n + m) for adjacency list, visited, and parent arrays.
Hints
- Use a queue and a visited structure to explore nodes level by level.
- Track each node's predecessor to reconstruct the path once the target is found.
- You can stop the BFS as soon as the target is discovered; distance is path length minus one.