CSES - Shared codeLink to this code:
https://cses.fi/paste/e1e8733260f2d739675974/
#include<bits/stdc++.h>
using namespace std;
class RoundTrip{
int n,m;
vector<int> *g;
public:
vector<bool>onStack;
vector<int>vis;
vector<int>sol;
RoundTrip(int n,int m,vector<int> g[]){
this->n=n;
this->m=m;
this->g=g;
onStack.resize(n+1,false);
vis.resize(n+1,0);
}
bool dfs(int u){
if(vis[u]){
if(onStack[u]){
onStack[u]=false;
sol.push_back(u);
return true;
}
return false;
}
onStack[u]=true;
vis[u]=true;
for(int v:g[u]){
if(dfs(v)){
if(onStack[u]){
sol.push_back(u);
onStack[u]=false;
return true;
}
else{
sol.push_back(u);
return false;
}
}
if(!sol.empty() and sol[0]==sol.back())return false;
}
onStack[u]=false;
return false;
}
void printLoop(){
if(sol.empty()){
cout<<"IMPOSSIBLE\n";
}else{
reverse(sol.begin(),sol.end());
cout<<sol.size()<<endl;
for(int i:sol)cout<<i<<" ";
}
}
};
int main(){
int n,m,a,b;
cin>>n>>m;
vector<int>g[n+1];
for(int i=0;i<m;i++){
cin>>a>>b;
g[a].push_back(b);
}
RoundTrip ans(n,m,g);
for(int i=1;i<=n;i++){
if(ans.vis[i])continue;
ans.dfs(i);
if(!ans.sol.empty())break;
}
ans.printLoop();
return 0;
}