Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- bool is_cycle = 0;
- vector <int> temp_s, ans;
- int st(int &start) {
- int l=0, r = temp_s.size()-1, i;
- while (l < r) {
- i = (l + r) / 2;
- if (temp_s[i] == start) {
- return i;
- }
- else if (temp_s[i] > start) {
- r = i;
- }
- else {
- l = r;
- }
- }
- return -1;
- }
- void push_ans(int start) {
- start = st(start);
- for (int i = start; i < temp_s.size(); i++) {//пушбэкаем ответ до серой вершины
- ans.push_back(temp_s[i] + 1);
- }
- }
- void dfs(int v, vector <int>& visited, vector<vector<int>>& graph) {
- visited[v] = 1; // отмечаем, что вошли в вершину
- temp_s.push_back(v);
- for (int i = 0; i < graph[v].size(); i++) { // перебираем всех соседей
- int u = graph[v][i];
- if (visited[u] == 0) {
- dfs(u, visited, graph);
- }
- else if (visited[u] == 1) {// если сосед на пути от корня до текущей, то мы нашли цикл
- push_ans(u);
- is_cycle = 1;
- return;
- }
- }
- visited[v] = 2; // отмечаем, что вышли из вершины
- temp_s.pop_back();
- }
- int main()
- {
- int n, m;
- cin >> n >> m;
- vector <vector <int>> graph(n);
- int u, v;
- for (int i = 0; i < m; i++) {
- cin >> u >> v;
- u--;
- v--;
- graph[u].push_back(v);
- }
- vector <int> visited(n, 0);// массив из n значений Color.White (0)
- int sz = graph.size();
- for (int i = 0; i < sz; i++) { // перебираем все вершины
- if (visited[i] == 0) {
- dfs(i, visited, graph); // от каждой еще не посещенной запускаем dfs
- if (is_cycle == 1) break;
- }
- }
- if (is_cycle == 0) cout << -1;
- else {
- cout << ans.size() << '\n';
- for (int i = 0; i < ans.size(); i++) {
- cout << ans[i] << " ";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment