fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. // Để kiểm tra có tồn tại chu trình trong đồ thị có hướng hay không
  12. // thì ta cũng kiểm tra có tồn tại cung ngược trong cây dfs hay không
  13. // Nhưng sẽ phức tạp hơn vì bên cây dfs cho đồ thị có hướng
  14. // có thêm 2 loại cung khác là cung xuôi và cung chéo
  15. // nên cần lưu ý phân biệt được các loại cung này
  16. const int N = 1e5 + 5;
  17.  
  18. int n, m;
  19. vector<int> adj[N];
  20.  
  21. int color[N];
  22. int p[N];
  23. int cycle_start, cycle_end;
  24.  
  25. // color[u] = 0/1/2
  26. // 0 : u chưa được thăm (dfs chưa gọi đến u)
  27. // 1 : u đang được thăm (dfs đã gọi đến u nhưng vẫn chưa thoát khỏi u)
  28. // 2 : u đã được thăm (dfs đã thoát khỏi u)
  29. void dfs(int u) {
  30. color[u] = 1;
  31. for (int v : adj[u]) {
  32. if (!color[v]) {
  33. // (u, v) là cung của cây dfs
  34. p[v] = u;
  35. dfs(v);
  36. }
  37. else if (color[v] == 1) {
  38. // (u, v) là cung ngược
  39. cycle_start = v;
  40. cycle_end = u;
  41. }
  42. // else {
  43. // // (u, v) là cung xuôi / cung chéo
  44. // }
  45. }
  46. color[u] = 2;
  47. }
  48.  
  49. int main() {
  50. ios::sync_with_stdio(false);
  51. cin.tie(nullptr);
  52. cin >> n >> m;
  53.  
  54. for (int i = 0; i < m; i++) {
  55. int u, v;
  56. cin >> u >> v;
  57. adj[u].push_back(v);
  58. }
  59.  
  60. memset(color, 0, sizeof color);
  61. cycle_start = cycle_end = -1;
  62. for (int u = 1; u <= n; u++) {
  63. if (!color[u]) dfs(u);
  64. }
  65.  
  66. if (cycle_start == -1) {
  67. cout << "IMPOSSIBLE" << '\n';
  68. }
  69. else {
  70. vector<int> cycle;
  71. int t = cycle_end;
  72. while (true) {
  73. cycle.push_back(t);
  74. if (t == cycle_start) break;
  75. t = p[t];
  76. }
  77. reverse(cycle.begin(), cycle.end());
  78. cycle.push_back(cycle_start);
  79.  
  80. cout << cycle.size() << '\n';
  81. for (int u : cycle) cout << u << ' ';
  82. }
  83. }
Success #stdin #stdout 0.01s 6404KB
stdin
4 5
1 3
2 1
2 4
3 2
3 4
stdout
4
1 3 2 1