From 1f1724e314ec9e854dce6b0ce54451dfc512d7c9 Mon Sep 17 00:00:00 2001 From: Sahil Tripathi <55251741+sahil2128@users.noreply.github.com> Date: Wed, 28 Jul 2021 22:45:01 +0530 Subject: [PATCH] Create Detect Cycle in a Directed Graph.cpp --- Detect Cycle in a Directed Graph.cpp | 91 ++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 Detect Cycle in a Directed Graph.cpp diff --git a/Detect Cycle in a Directed Graph.cpp b/Detect Cycle in a Directed Graph.cpp new file mode 100644 index 0000000..8cb5c0a --- /dev/null +++ b/Detect Cycle in a Directed Graph.cpp @@ -0,0 +1,91 @@ +// A C++ Program to detect cycle in a graph +#include + +using namespace std; + +class Graph +{ + int V; // No. of vertices + list *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[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 DFSUtil() in https://www.geeksforgeeks.org/archives/18212 +bool 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::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/18212 +bool 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; +}