Like directed graphs, we can use DFS to detect cycle in an undirected graph in O(V+E) time. We do a DFS traversal of the given graph. For every visited vertex ‘v’, if there is an adjacent ‘u’ such that u is already visited and u is not parent of v, then there is a cycle in graph. If we don’t find such an adjacent for any vertex, we say that there is no cycle. The assumption of this approach is that there are no parallel edges between any two vertices.
// A Java Program to detect cycle in an undirected graphimportjava.io.*;importjava.util.*;// This class represents a directed graph using adjacency list// representationclassGraph{privateint V; // No. of verticesprivateLinkedList<Integer> adj[]; // Adjacency List Represntation// ConstructorGraph(int v) { V = v; adj =newLinkedList[v];for(int i=0; i<v; ++i) adj[i] =newLinkedList(); }// Function to add an edge into the graphvoidaddEdge(int v,int w) { adj[v].add(w); adj[w].add(v); }// A recursive function that uses visited[] and parent to detect// cycle in subgraph reachable from vertex v.BooleanisCyclicUtil(int v,Boolean visited[],int parent) {// Mark the current node as visited visited[v] =true;Integer i;// Recur for all the vertices adjacent to this vertexIterator<Integer> it = adj[v].iterator();while (it.hasNext()) { i =it.next();// If an adjacent is not visited, then recur for that// adjacentif (!visited[i]) {if (isCyclicUtil(i, visited, v))returntrue; }// If an adjacent is visited and not parent of current// vertex, then there is a cycle.elseif (i != parent)returntrue; }returnfalse; }// Returns true if the graph contains a cycle, else false.BooleanisCyclic() {// Mark all the vertices as not visited and not part of// recursion stackBoolean visited[] =newBoolean[V];for (int i =0; i < V; i++) visited[i] =false;// Call the recursive helper function to detect cycle in// different DFS treesfor (int u =0; u < V; u++)if (!visited[u]) // Don't recur for u if already visitedif (isCyclicUtil(u, visited,-1))returntrue;returnfalse; }// Driver method to test above methodspublicstaticvoidmain(String args[]) {// Create a graph given in the above diagramGraph g1 =newGraph(5);g1.addEdge(1,0);g1.addEdge(0,2);g1.addEdge(2,0);g1.addEdge(0,3);g1.addEdge(3,4);if (g1.isCyclic())System.out.println("Graph contains cycle");elseSystem.out.println("Graph doesn't contains cycle");Graph g2 =newGraph(3);g2.addEdge(0,1);g2.addEdge(1,2);if (g2.isCyclic())System.out.println("Graph contains cycle");elseSystem.out.println("Graph doesn't contains cycle"); }}
We do a BFS traversal of the given graph. For every visited vertex ‘v’, if there is an adjacent ‘u’ such that u is already visited and u is not parent of v, then there is a cycle in graph. If we don’t find such an adjacent for any vertex, we say that there is no cycle. The assumption of this approach is that there are no parallel edges between any two vertices.
We use a parent array to keep track of parent vertex for a vertex so that we do not consider visited parent as cycle.
booleanisCyclicConntected(vector<int> adj[],int s,int V,vector<bool>& visited){ // Set parent vertex for every vertex as -1. vector<int>parent(V,-1); // Create a queue for BFS queue<int> q; // Mark the current node as visited and enqueue itvisited[s] =true;q.push(s);while (!q.empty()) { // Dequeue a vertex from queue and print itint u =q.front();q.pop(); // Get all adjacent vertices of the dequeued // vertex s. If a adjacent has not been visited, // then mark it visited and enqueue it. We also // mark parent so that parent is not considered // for cycle.for (auto v :adj[u]) {if (!visited[v]) {visited[v] =true;q.push(v);parent[v] = u; }elseif (parent[u] != v)returntrue; } }returnfalse;}boolisCyclicDisconntected(vector<int> adj[],int V){ // Mark all the vertices as not visited vector<bool>visited(V,false);for (int i =0; i < V; i++)if (!visited[i] &&isCyclicConntected(adj, i, V, visited))returntrue;returnfalse;}