Untitled

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

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

int sz;
int path[100];
bool ed;

void dfs(int u){
  if (ed) return;
  // 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 && ed == 0){
      ed = 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';
    }
  }
  // 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;
  }
  ed = 0;
  sz = 0;
  for (int i = 1; i <= n; i++){
    if (!vis[i])
    dfs(i);
  }
  if (!ed) cout << "IMPOSSIBLE\n";
  for (int i = 1; i <= n; i++){
    vis[i] = 0;
    for (int j = 1; j <= n; j++) a[i][j] = 0;
  }
}

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