Given a graph where every edge has weight as either 0 or 1. A source vertex is also given in the graph. Find the shortest path from source vertex to every other vertex.
Input : Source Vertex = 0 and below graph Output : Shortest distances from given source 0 0 1 1 2 1 2 1 2 Explanation : Shortest distance from 0 to 0 is 0 Shortest distance from 0 to 1 is 0 Shortest distance from 0 to 2 is 1 ..................
In normal BFS of a graph all edges have equal weight but in 0-1 BFS some edges may have 0 weight and some may have 1 weight. In this we will not use bool array to mark visited nodes but at each step we will check for the optimal distance condition. We use double ended queue to store the node. While performing BFS if a edge having weight = 0 is found node is pushed at front of double ended queue and if a edge having weight = 1 is found, it is pushed at back of double ended queue.
The approach is similar to Dijkstra that the if the shortest distance to node is relaxed
by the previous node then only it will be pushed in the queue.
The above idea works in all cases, when pop a vertex (like Dijkstra), it is the minimum weight vertex among remaining vertices. If there is a 0 weight vertex adjacent to it, then this adjacent has same distance. If there is a 1 weight adjacent, then this adjacent has maximum distance among all vertices in dequeue (because all other vertices are either adjacent of currently popped vertex or adjacent of previously popped vertices).
Below is C++ implementation of the above idea.
0 0 1 1 2 1 2 1 2
This problem can also be solved by Dijkstra but the time complexity will be O(E + V Log V) whereas by BFS it will be O(V+E).
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.