Note:
The algorithm for detecting cycles in any directed graph is easier using recursive DFS. But Iterative DFS approach to detect a cycle is a bit complex and tricky. I have commented on the code where necessary to make the algorithm more understandable.
In any case, the time complexity of the algorithm is O(V+E).
#include <bits/stdc++.h>
using namespace std;
#define MAX 100005
bool detectCycle(int nodes, vector<vector<int> >& adjList)
{
if(nodes==1) return false;
stack<int> st;
bool on_stack[MAX+1]= {0};
bool visited[MAX+1]= {0};
for(int i=0; i<nodes; i++) //In case the graph is disconnected
{
if(visited[i]) continue; //For time efficiency
st.push(i);
while(!st.empty())
{
int u=st.top();
if(!visited[u])
{
visited[u]=1;
on_stack[u]=1;
}
else //backtracking, but keeping the visited array unchanged for time efficiency
{
on_stack[u]=0;
st.pop();
continue;
}
for(int j=0; j<adjList[u].size(); j++)
{
int v=adjList[u][j];
if(!visited[v])
{
st.push(v);
}
else
{
if(on_stack[v]) return true; //cycle detected
}
}
}
}
return false;
}
int main()
{
vector<vector<int> > adjList(MAX+1);
int nodes, edges;
cout<<"Enter the number of nodes: ";
cin>>nodes;
cout<<endl;
cout<<"Enter the number of edges: ";
cin>>edges;
cout<<endl;
cout<<"Enter the pair of edges: "<<endl;
for(int i=0; i<edges; i++)
{
int from, to;
cin>> from>> to;
adjList[from].push_back(to);
}
if(detectCycle(nodes, adjList)==1) cout<<"Cycle found!"<<endl;
else cout<<"Cycle not found!"<<endl;
return 0;
}