From 6d2a77d08d9e210e190c88d53ced3af34dee6966 Mon Sep 17 00:00:00 2001 From: abhibarkade111 <74983266+abhibarkade111@users.noreply.github.com> Date: Fri, 29 Oct 2021 15:30:01 +0530 Subject: [PATCH] Create detectCycleDirectedGraph.cpp added Detect Cycle in a Directed Graph c++ program --- detectCycleDirectedGraph.cpp | 84 ++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 detectCycleDirectedGraph.cpp diff --git a/detectCycleDirectedGraph.cpp b/detectCycleDirectedGraph.cpp new file mode 100644 index 0000000..d8f0643 --- /dev/null +++ b/detectCycleDirectedGraph.cpp @@ -0,0 +1,84 @@ +// C++ Program to detect cycle in a graph +#include + +using namespace std; + +class Graph +{ + int V; + 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. +} +bool Graph::isCyclicUtil(int v, bool visited[], bool *recStack) +{ + if(visited[v] == false) + { + + visited[v] = true; + recStack[v] = true; + + 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; +} + + +bool Graph::isCyclic() +{ + + bool *visited = new bool[V]; + bool *recStack = new bool[V]; + for(int i = 0; i < V; i++) + { + visited[i] = false; + recStack[i] = false; + } + + 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; +}