-
Notifications
You must be signed in to change notification settings - Fork 172
/
detect cycle directed graph.cpp
68 lines (55 loc) · 1.17 KB
/
detect cycle directed graph.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* https://sapphireengine.com/@/6tfphj */
/* https://cses.fi/problemset/task/1678 */
#include<iostream>
using namespace std;
int graph[100][100];
int n;
bool dfs( int node , bool *visited , bool *inloop , int &prev ){
visited[node] = 1;
inloop[node] = 1;
for(int i=0;i<n;i++){
if( graph[node][i]){
if(!visited[i]){
if(dfs( i , visited , inloop , prev)){
if(i==prev)
cout<<i<<" " , prev=-1;
else if (prev!=-1)
cout<<i<<" ";
return true;
}
}
else if ( inloop[i] ){
prev=i;
return true;
}
}
}
inloop[node]=0;
return false;
}
bool checkCycle (bool *visited){
int prev = -1;
bool inloop[n] = {false};
for(int i=0; i<n; i++)
if( !visited[i] && dfs(i,visited, inloop, prev))
return true;
return false;
}
int main(){
// Input nodes
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
graph[i][j]=0;
// Input Edges
int t;
cin>>t;
int x,y;
for(int i=0;i<t;i++){
cin>>x>>y;
graph[x][y]=1;
}
bool visited[n] = {false};
cout<<checkCycle(visited)<<endl;
return 0;
}