Given a directed graph, check whether the graph contains a cycle or not. Your function should return true if the given graph contains at least one cycle, else return false. For example, the following graph contains three cycles 0->2->0, 0->1->2->0 and 3->3, so your function must return true.
Depth First Traversal can be used to detect a cycle in a Graph. DFS for a connected graph produces a tree. There is a cycle in a graph only if there is a back edge present in the graph. A back edge is an edge that is from a node to itself (self-loop) or one of its ancestor in the tree produced by DFS. In the following graph, there are 3 back edges, marked with a cross sign. We can observe that these 3 back edges indicate 3 cycles present in the graph.
For a disconnected graph, we get the DFS forest as output. To detect cycle, we can check for a cycle in individual trees by checking back edges.
To detect a back edge, we can keep track of vertices currently in recursion stack of function for DFS traversal. If we reach a vertex that is already in the recursion stack, then there is a cycle in the tree. The edge that connects current vertex to the vertex in the recursion stack is a back edge. We have used recStack array to keep track of vertices in the recursion stack.
Below image is a dry run of the above approach:
Below is the implementation of the above approach:
link brightness_4 code
// A C++ Program to detect cycle in a graph
intV; // No. of vertices
list<int> *adj; // Pointer to an array containing adjacency lists
boolisCyclicUtil(intv, boolvisited, bool*rs); // used by isCyclic()
Graph(intV); // Constructor
voidaddEdge(intv, intw); // to add an edge to graph
boolisCyclic(); // returns true if there is a cycle in this graph