Given a directed graph, find out whether the graph is strongly connected or not. A directed graph is strongly connected if there is a path between any two pair of vertices. For example, following is a strongly connected graph.
It is easy for undirected graph, we can just do a BFS and DFS starting from any vertex. If BFS or DFS visits all vertices, then the given undirected graph is connected. This approach won’t work for a directed graph. For example, consider the following graph which is not strongly connected. If we start DFS (or BFS) from vertex 0, we can reach all vertices, but if we start from any other vertex, we cannot reach all vertices.
How to do for directed graph?
We can also do DFS V times starting from every vertex. If any DFS, doesn’t visit all vertices, then graph is not strongly connected. This algorithm takes O(V*(V+E)) time which can be same as transitive closure for a dense graph.
A better idea can be Strongly Connected Components (SCC) algorithm. We can find all SCCs in O(V+E) time. If number of SCCs is one, then graph is strongly connected. The algorithm for SCC does extra work as it finds all SCCs.
Following is Kosaraju’s DFS based simple algorithm that does two DFS traversals of graph:
1) Initialize all vertices as not visited.
2) Do a DFS traversal of graph starting from any arbitrary vertex v. If DFS traversal doesn’t visit all vertices, then return false.
3) Reverse all arcs (or find transpose or reverse of graph)
4) Mark all vertices as not-visited in reversed graph.
5) Do a DFS traversal of reversed graph starting from same vertex v (Same as step 2). If DFS traversal doesn’t visit all vertices, then return false. Otherwise return true.
The idea is, if every node can be reached from a vertex v, and every node can reach v, then the graph is strongly connected. In step 2, we check if all vertices are reachable from v. In step 4, we check if all vertices can reach v (In reversed graph, if all vertices are reachable from v, then all vertices can reach v in original graph).
Following is the implementation of above algorithm.
Time Complexity: Time complexity of above implementation is sane as Depth First Search which is O(V+E) if the graph is represented using adjacency list representation.
Can we improve further?
The above approach requires two traversals of graph. We can find whether a graph is strongly connected or not in one traversal using Tarjan’s Algorithm to find Strongly Connected Components.
Can we use BFS instead of DFS in above algorithm? See this.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
- Check if a given directed graph is strongly connected | Set 2 (Kosaraju using BFS)
- Convert undirected connected graph to strongly connected directed graph
- Check if a graph is Strongly, Unilaterally or Weakly connected
- Minimum edges required to make a Directed Graph Strongly Connected
- Strongly Connected Components
- Tarjan's Algorithm to find Strongly Connected Components
- Comparision between Tarjan's and Kosaraju's Algorithm
- Check if a given graph is Bipartite using DFS
- Graph implementation using STL for competitive programming | Set 1 (DFS of Unweighted and Undirected)
- Check if the given permutation is a valid DFS of graph
- Transitive Closure of a Graph using DFS
- Minimum number of edges between two vertices of a graph using DFS
- Check if a directed graph is connected or not
- Check if there exists a connected graph that satisfies the given conditions
- Queries to check if vertices X and Y are in the same Connected Component of an Undirected Graph
- Check if longest connected component forms a palindrome in undirected graph
- Check if a given Graph is 2-edge connected or not
- Check if every vertex triplet in graph contains two vertices connected to third vertex
- Count of unique lengths of connected components for an undirected graph using STL
- DFS for a n-ary tree (acyclic graph) represented as adjacency list