st数组记录每个点的状态:0表示没访问过,1表示访问过,2表示与该点相邻的点都被访问过。
dfs深搜如果遇到被标记成1的点,就说明有环。
#include <iostream>
using namespace std;
const int N = 1010;
int g[N][N], n, m, st[N], flag = 1;
void dfs(int k) {
st[k] = 1;
for(int i = 1; i <= n; i++) {
if(g[k][i]) { //和k点相邻
if(st[i] == 1) {
flag = 0;
break;
}
if(st[i] == 2) //直接跳过这个点
continue;
dfs(i);
}
}
st[k] = 2;
}
int main() {
cin>>n>>m;
while(m--) {
int x, y;
cin>>x>>y;
g[x][y] = 1;
}
for(int i = 1; i <= n; i++)
if(!st[i])
dfs(i);
if(!flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
return 0;
}