//#include #include #include #include using std::vector; //using std::pair; void explore(vector> &adj, int v, vector &visited, vector &prev, vector &postv, vector &clock) { visited.push_back(v); prev[v] = clock[0]; clock[0] = clock[0] + 1; for (size_t i = 0; i < adj[v].size(); i++) { if (std::find(visited.begin(), visited.end(), adj[v][i]) == visited.end()) explore(adj, adj[v][i], visited, prev, postv, clock); } postv[v] = clock[0]; clock[0] = clock[0] + 1; } void dfs(vector> &adj, vector &visited, vector &prev, vector &postv, vector &clock) { for (size_t v = 0; v < adj.size(); v++) { if (std::find(visited.begin(), visited.end(), v) == visited.end()) explore(adj, v, visited, prev, postv, clock); } } int acyclic(vector > &adj) { vector visited; vector prev(adj.size(), 0); vector postv(adj.size(), 0); vector clock(1, 0); dfs(adj, visited, prev, postv, clock); for (size_t u = 0; u < adj.size(); u++) { for (size_t i = 0; i < adj[u].size(); i++) { if (postv[u] <= postv[adj[u][i]]) return 1; } } return 0; } //TEST(Acyclicity, ac1) { // vector> adj = { { 1 }, { 2 }, { 0 }, { 0 } }; // ASSERT_EQ(acyclic(adj), 1); //} int main() { size_t n, m; std::cin >> n >> m; vector > adj(n, vector()); for (size_t i = 0; i < m; i++) { int x, y; std::cin >> x >> y; adj[x - 1].push_back(y - 1); } std::cout << acyclic(adj); }