Untitled
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