Untitled
user_5379400
plain_text
a year ago
1.6 kB
21
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