Untitled
user_5379400
plain_text
a year ago
1.4 kB
12
Indexable
#include<bits/stdc++.h>
using namespace std;
int n, m;
vector<int> a[100005];
int vis[100005];
vector<int> path;
void dfs(int u){
// path lưu đường đi từ điểm đầu tiên đến điểm hiện tại
path.push_back(u);
vis[u] = 1;
// duyệt qua hết các cạnh của u
for (int v : a[u]){
// 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 sz = path.size();
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
path.pop_back();
}
void solve(int testcase){
cin >> n >> m;
for (int i = 0; i < m; i++){
int u, v; cin >> u >> v;
a[u].push_back(v);
}
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