1 min read
https://www.geeksforgeeks.org/detect-cycle-in-a-graph/
Using DFS
class Solution {
bool dfsHelper(int i, vector<bool> &visited, vector<bool> &visitedDirected,
vector<int> adj[]) {
visited[i] = true;
visitedDirected[i] = true;
for (int it : adj[i]) {
if (!visited[it]) {
if (dfsHelper(it, visited, visitedDirected, adj)) {
return true;
}
} else if (visitedDirected[it]) {
return true;
}
}
visitedDirected[i] = false;
return false;
}
public:
bool isCyclic(int V, vector<int> adj[]) {
vector<bool> visited(V, false);
vector<bool> visitedDirected(V, false);
for (int i = 0; i < V; i++) {
if (!visited[i]) {
if (dfsHelper(i, visited, visitedDirected, adj)) {
return true;
}
}
}
return false;
}
};
Using BFS
class Solution {
public:
bool isCyclic(int V, vector<int> adj[]) {
vector<int> inDegree(V, 0);
queue<int> q;
for (int i = 0; i < V; i++) {
for (auto it : adj[i]) {
inDegree[it]++;
}
}
for (int i = 0; i < V; i++) {
if (inDegree[i] == 0) {
q.push(i);
}
}
int ctr = 0;
while (!q.empty()) {
int node = q.front();
q.pop();
ctr++;
for (auto it : adj[node]) {
inDegree[it]--;
if (inDegree[it] == 0) {
q.push(it);
}
}
}
if (ctr == V)
return false;
return true;
}
};