思路:
利用book[]标记状态,0表示未访问,1表示正在访问,2表示所有子节点访问完毕。然后dfs每个点寻找是否存在回路。
#include <iostream>
#include <vector>
using namespace std;
vector<int> map[1111];
int flag = 0, book[1111];
bool dfs(int cur) {
book[cur] = 1;
for (auto i : map[cur]) {
if (book[i] == 1)
return true;
else if (book[i] == 0) {
if (dfs(i))
return true;
}
}
book[cur] = 2;
return false;
}
int main() {
int n, m, a, b;
cin >> n >> m;
while (m--) {
cin >> a >> b;
map[a].push_back(b);
}
int flag = 0;
for (int i = 1; i <= n; i++) {
if (!book[i]) {
if (dfs(i)) {
flag = 1;
}
}
}
cout << (flag ? "have" : "not have");
return 0;
}