Untitled

 avatar
user_5379400
plain_text
a year ago
1.5 kB
6
Indexable
#include<bits/stdc++.h>
using namespace std;

int n, m;
int a[1000][1000];
int vis[1000];

int sz;
int path[100];

void dfs(int u){
  // path lưu đường đi từ điểm đầu tiên đến điểm hiện tại
  path[sz++] = u;
  vis[u] = 1;
  // duyệt qua hết các cạnh của u
  for (int i = 1; i <= n; i++){
    int v = i;
    if (a[u][v] == 0) continue;
    // nếu chưa thăm thì dfs
    if (!vis[v]) dfs(v);
    // nếu v có giá trị là 1, nghĩa là chưa thăm xong đỉnh 1, trong path vẫn có đỉnh v,
    // và sau đấy lại đi đến v 1 lần nữa -> có chu trình 
    else if (vis[v] == 1){
      int j = sz - 1;
      // tìm giá trị j gần nhất có path[j] = v
      while(path[j] != v) j--;
      // in 
      cout << sz - j + 1 << '\n';
      for (int k = j; k < sz; k++){
        cout << path[k] << ' ';
      }
      cout << v << '\n';
      exit(0);
    }
  }
  // 2 nghĩa là đã thăm xong đinhr u
  vis[u] = 2;
  // sau khi thăm xong đinh u, gỡ đỉnh u khỏi đường đi
  sz--;
}

void solve(int testcase){
  cin >> n >> m;
  for (int i = 0; i < m; i++){
    int u, v; cin >> u >> v;
    a[u][v] = 1;
  }
  for (int i = 1; i <= n; i++){
    if (!vis[i])
    dfs(i);
  }
  cout << "IMPOSSIBLE";
}

int main(){
  //freopen("input.txt", "r", stdin);
  int t = 1;
  //cin >> t;
  for (int i = 1; i <= t; i++) solve(i);
}
Editor is loading...
Leave a Comment