Shortest Path in Unweighted Graph Using BFS in DSA Java - Time & Space Complexity
We want to understand how long it takes to find the shortest path in an unweighted graph using BFS.
How does the time needed grow as the graph gets bigger?
Analyze the time complexity of the following code snippet.
// BFS to find shortest path in unweighted graph
void bfsShortestPath(List<List<Integer>> graph, int start, int end) {
int n = graph.size();
boolean[] visited = new boolean[n];
int[] distance = new int[n];
Arrays.fill(distance, -1);
Queue<Integer> queue = new LinkedList<>();
queue.add(start);
visited[start] = true;
distance[start] = 0;
while (!queue.isEmpty()) {
int node = queue.poll();
for (int neighbor : graph.get(node)) {
if (!visited[neighbor]) {
visited[neighbor] = true;
distance[neighbor] = distance[node] + 1;
queue.add(neighbor);
}
}
}
}
This code finds the shortest distance from a start node to all others in an unweighted graph using BFS.
Look at what repeats as the graph grows.
- Primary operation: Visiting each node and checking its neighbors.
- How many times: Each node is visited once, and each edge is checked once.
As the graph grows, the work grows with the number of nodes and edges.
| Input Size (n nodes, e edges) | Approx. Operations |
|---|---|
| 10 nodes, 15 edges | About 10 + 15 = 25 checks |
| 100 nodes, 200 edges | About 100 + 200 = 300 checks |
| 1000 nodes, 5000 edges | About 1000 + 5000 = 6000 checks |
Pattern observation: The total work grows roughly with the sum of nodes and edges.
Time Complexity: O(n + e)
This means the time grows linearly with the number of nodes plus the number of edges in the graph.
[X] Wrong: "BFS takes O(n²) time because it checks all pairs of nodes."
[OK] Correct: BFS only visits each node and edge once, not all pairs. So it does not check every possible pair, avoiding the square growth.
Understanding BFS time complexity helps you explain why it is efficient for shortest paths in unweighted graphs, a common interview topic.
"What if the graph was represented as an adjacency matrix instead of adjacency lists? How would the time complexity change?"
Practice
Solution
Step 1: Understand BFS traversal
BFS explores nodes level by level starting from the source node, visiting all neighbors before moving deeper.Step 2: BFS finds shortest paths in unweighted graphs
Because BFS visits nodes in order of increasing distance, the first time it reaches a node is via the shortest path.Final Answer:
The shortest path from a start node to all other nodes -> Option AQuick Check:
BFS = shortest path in unweighted graph [OK]
- Confusing BFS with DFS for shortest path
- Thinking BFS finds longest path
- Assuming BFS works only for weighted graphs
Solution
Step 1: Recall BFS traversal order
BFS explores nodes in a first-in, first-out order to visit neighbors level by level.Step 2: Identify the correct data structure
A Queue supports FIFO order, making it ideal for BFS traversal.Final Answer:
Queue -> Option AQuick Check:
BFS uses Queue for level order traversal [OK]
- Using Stack which is LIFO and suits DFS
- Confusing PriorityQueue with Queue
- Using HashMap which stores key-value pairs, not order
Graph edges: 0 - 1 0 - 2 1 - 3 2 - 3 3 - 4Assume nodes are 0 to 4 and distance to start node is 0.
Solution
Step 1: Start BFS from node 0 and set distance 0
Distance[0] = 0. Neighbors 1 and 2 get distance 1.Step 2: Visit neighbors of 1 and 2
Node 3 is neighbor of both 1 and 2, first reached at distance 2.Step 3: Visit neighbor of 3
Node 4 is neighbor of 3, distance is 3.Final Answer:
[0, 1, 1, 2, 3] -> Option DQuick Check:
Distances increase by 1 per BFS level [OK]
- Assigning wrong distances to node 3
- Confusing BFS with DFS distances
- Setting all distances to zero
int[] dist = new int[n];
Arrays.fill(dist, Integer.MAX_VALUE);
Queue<Integer> q = new LinkedList<>();
q.add(start);
dist[start] = 0;
while(!q.isEmpty()) {
int u = q.poll();
for(int v : graph.get(u)) {
if(dist[v] == 0) {
dist[v] = dist[u] + 1;
q.add(v);
}
}
}Solution
Step 1: Understand distance initialization
Distances are set to Integer.MAX_VALUE to mark unvisited nodes.Step 2: Check visitation condition
Condition 'dist[v] == 0' wrongly checks for zero, but unvisited nodes have Integer.MAX_VALUE.Step 3: Correct condition
Change condition to 'dist[v] == Integer.MAX_VALUE' to detect unvisited nodes properly.Final Answer:
The condition 'dist[v] == 0' should check for Integer.MAX_VALUE instead -> Option CQuick Check:
Check unvisited nodes by Integer.MAX_VALUE [OK]
- Using zero to check unvisited nodes when distances initialized to max
- Using Stack instead of Queue for BFS
- Incorrect distance initialization
0-1, 0-2, 1-3, 2-3, 3-4, 4-5If BFS starts at node 0, what is the shortest path from node 0 to node 5?
Solution
Step 1: Run BFS to find shortest distances
Distances: 0->0, 1->1, 2->1, 3->2, 4->3, 5->4.Step 2: Trace shortest path from 5 back to 0
From 5 to 4, 4 to 3, 3 to 1 or 2, choose 1 for shortest path: 0->1->3->4->5.Final Answer:
[0, 1, 3, 4, 5] -> Option BQuick Check:
Shortest path follows BFS layers [OK]
- Choosing longer paths ignoring BFS distances
- Skipping nodes in path
- Confusing BFS with DFS path
Ready to prove it?
Pass the test and this pattern moves unknown
