C Program to Detect Cycle in a Directed Graph - GeeksforGeeks

02 Jan, 2019
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.
C++
// A C++ Program to detect cycle in a graph#include <iostream>#include <limits.h>#include <list>  using namespace std;  class Graph {    int V; // No. of vertices    list<int>* adj; // Pointer to an array containing adjacency lists    bool isCyclicUtil(int v, bool visited[], bool* rs); // used by isCyclic()public:    Graph(int V); // Constructor    void addEdge(int v, int w); // to add an edge to graph    bool isCyclic(); // returns true if there is a cycle in this graph};  Graph::Graph(int V){    this->V = V;    adj = new list<int>[V];}  void Graph::addEdge(int v, int w){    adj[v].push_back(w); // Add w to v’s list.}  // This function is a variation of DFSUytil()// in https:// www.geeksforgeeks.org/archives/18212bool Graph::isCyclicUtil(int v, bool visited[], bool* recStack){    if (visited[v] == false) {        // Mark the current node as visited and part of recursion stack        visited[v] = true;        recStack[v] = true;          // Recur for all the vertices adjacent to this vertex        list<int>::iterator i;        for (i = adj[v].begin(); i != adj[v].end(); ++i) {            if (!visited[*i] && isCyclicUtil(*i, visited, recStack))                return true;            else if (recStack[*i])                return true;        }    }    recStack[v] = false; // remove the vertex from recursion stack    return false;}  // Returns true if the graph contains a cycle, else false.// This function is a variation of DFS()// in https:// www.geeksforgeeks.org/archives/18212bool Graph::isCyclic(){    // Mark all the vertices as not visited and not part of recursion    // stack    bool* visited = new bool[V];    bool* recStack = new bool[V];    for (int i = 0; i < V; i++) {        visited[i] = false;        recStack[i] = false;    }      // Call the recursive helper function to detect cycle in different    // DFS trees    for (int i = 0; i < V; i++)        if (isCyclicUtil(i, visited, recStack))            return true;      return false;}  int main(){    // Create a graph given in the above diagram    Graph g(4);    g.addEdge(0, 1);    g.addEdge(0, 2);    g.addEdge(1, 2);    g.addEdge(2, 0);    g.addEdge(2, 3);    g.addEdge(3, 3);      if (g.isCyclic())        cout << "Graph contains cycle";    else        cout << "Graph doesn't contain cycle";    return 0;}
Graph contains cycle

Please refer complete article on Detect Cycle in a Directed Graph for more details!
C Programs
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
C Program to read contents of Whole File
Producer Consumer Problem in C
Exit codes in C/C++ with Examples
C program to find the length of a string
Handling multiple clients on server with multithreading using Socket Programming in C/C++
C / C++ Program for Dijkstra's shortest path algorithm | Greedy Algo-7
Regular expressions in C
Create n-child process from same parent process using fork() in C
Conditional wait and signal in multi-threading
How to store words in an array in C?