...
/Cycle Detection Using Breadth-First Search
Cycle Detection Using Breadth-First Search
Learn to detect a cycle in a graph using Breadth-First Search.
We'll cover the following...
Problem statement
You are given an undirected graph, and you need to check whether there is any cycle or not.
Solution
To solve this problem, either Breadth-First Search or Depth First Search can be used to detect cycles. In the case of a directed graph, only the Depth-First Search can be used. Let’s move on to the implementation as we have already discussed Breadth-First Search and there is only a minor difference in the solution. Let’s look at the code now.
Press + to interact
#include <iostream>#include <map>#include <queue>#include <list>using namespace std;template <typename T>class Graph{map<T, list<T>> adjList;public:Graph(){}void addEdge(T u, T v, bool bidir = true){adjList[u].push_back(v);if (bidir)adjList[v].push_back(u);}bool isCyclicBFS(T src){map<T, bool> visited;map<T, int> parent;queue<T> q;q.push(src);visited[src] = true;parent[src] = src;while (!q.empty()){T node = q.front();q.pop();//Iterate over the neighbors of that node leaving the parent nodefor (T neighbor : adjList[node]){if (visited[neighbor] == true && parent[node] != neighbor)return true;else if (!visited[neighbor]){visited[neighbor] = true;parent[neighbor] = node;q.push(neighbor);}}}return false;}};int main(){Graph<int> g;g.addEdge(1, 2);g.addEdge(1, 4);g.addEdge(4, 3);g.addEdge(2, 3);if (g.isCyclicBFS(1))cout << "Cyclic Graph";elsecout << "Non cyclic";}
Explanation:
- From lines 1 to 4, we