This documentation is automatically generated by competitive-verifier/competitive-verifier
// clang-format off
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/cycle_detection
// clang-format on
#include <iostream>
#include "../../graph/others/cycle-detection.hpp"
using namespace std;
int main() {
int N, M;
cin >> N >> M;
CycleDetection<> g(N);
g.read(M, 0, false, true);
auto ret = g.build();
if (ret.empty()) {
cout << -1 << "\n";
} else {
cout << ret.size() << "\n";
for (auto& e : ret) cout << e.idx << "\n";
}
}
#line 1 "test/verify/yosupo-cycle-detection.test.cpp"
// clang-format off
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/cycle_detection
// clang-format on
#include <iostream>
#line 2 "graph/others/cycle-detection.hpp"
#include <algorithm>
#include <iterator>
#include <vector>
#line 2 "graph/graph-template.hpp"
#include <cstddef>
#line 6 "graph/graph-template.hpp"
template <typename T = int>
struct Edge {
int from, to;
T cost;
int idx;
Edge() = default;
Edge(int from, int to, T cost = 1, int idx = -1)
: from(from), to(to), cost(cost), idx(idx) {}
operator int() const { return to; }
};
template <typename T = int>
struct Graph {
std::vector<std::vector<Edge<T> > > g;
int es;
Graph() = default;
explicit Graph(int n) : g(n), es(0) {}
std::size_t size() const { return g.size(); }
void add_directed_edge(int from, int to, T cost = 1) {
g[from].emplace_back(from, to, cost, es++);
}
void add_edge(int from, int to, T cost = 1) {
g[from].emplace_back(from, to, cost, es);
g[to].emplace_back(to, from, cost, es++);
}
void read(int M, int padding = -1, bool weighted = false,
bool directed = false) {
for (int i = 0; i < M; i++) {
int a, b;
std::cin >> a >> b;
a += padding;
b += padding;
T c = T(1);
if (weighted) std::cin >> c;
if (directed)
add_directed_edge(a, b, c);
else
add_edge(a, b, c);
}
}
inline std::vector<Edge<T> >& operator[](const int& k) { return g[k]; }
inline const std::vector<Edge<T> >& operator[](const int& k) const {
return g[k];
}
};
template <typename T = int>
using Edges = std::vector<Edge<T> >;
#line 8 "graph/others/cycle-detection.hpp"
/**
* @brief Cycle Detection(閉路検出)
*
*/
template <typename T = int>
struct CycleDetection : Graph<T> {
using Graph<T>::Graph;
using Graph<T>::g;
std::vector<int> used;
Edges<T> pre, cycle;
bool dfs(int idx) {
used[idx] = 1;
for (auto& e : g[idx]) {
if (used[e] == 0) {
pre[e] = e;
if (dfs(e)) return true;
} else if (used[e] == 1) {
int cur = idx;
while (cur != e) {
cycle.emplace_back(pre[cur]);
cur = pre[cur].from;
}
cycle.emplace_back(e);
return true;
}
}
used[idx] = 2;
return false;
}
Edges<T> build() {
used.assign(g.size(), 0);
pre.resize(g.size());
for (int i = 0; i < (int)g.size(); i++) {
if (used[i] == 0 && dfs(i)) {
std::reverse(std::begin(cycle), std::end(cycle));
return cycle;
}
}
return {};
}
};
#line 8 "test/verify/yosupo-cycle-detection.test.cpp"
using namespace std;
int main() {
int N, M;
cin >> N >> M;
CycleDetection<> g(N);
g.read(M, 0, false, true);
auto ret = g.build();
if (ret.empty()) {
cout << -1 << "\n";
} else {
cout << ret.size() << "\n";
for (auto& e : ret) cout << e.idx << "\n";
}
}
| Env | Name | Status | Elapsed | Memory |
|---|---|---|---|---|
| g++ | example_00 |
|
2 ms | 4 MB |
| g++ | example_01 |
|
1 ms | 4 MB |
| g++ | example_02 |
|
1 ms | 4 MB |
| g++ | long_cycle_00 |
|
234 ms | 60 MB |
| g++ | long_cycle_01 |
|
187 ms | 49 MB |
| g++ | random_00 |
|
126 ms | 31 MB |
| g++ | random_01 |
|
138 ms | 35 MB |
| g++ | random_02 |
|
95 ms | 16 MB |
| g++ | random_03 |
|
13 ms | 23 MB |
| g++ | random_04 |
|
32 ms | 18 MB |
| g++ | random_05 |
|
128 ms | 27 MB |
| g++ | random_06 |
|
82 ms | 30 MB |
| g++ | random_07 |
|
6 ms | 8 MB |
| g++ | random_08 |
|
91 ms | 23 MB |
| g++ | random_09 |
|
53 ms | 13 MB |
| g++ | random_dag_00 |
|
155 ms | 31 MB |
| g++ | random_dag_01 |
|
147 ms | 34 MB |
| g++ | random_dag_02 |
|
98 ms | 16 MB |
| g++ | random_dag_03 |
|
13 ms | 23 MB |
| g++ | random_dag_04 |
|
33 ms | 18 MB |
| g++ | random_dag_05 |
|
132 ms | 27 MB |
| g++ | random_dag_06 |
|
80 ms | 30 MB |
| g++ | random_dag_07 |
|
6 ms | 8 MB |
| g++ | random_dag_08 |
|
107 ms | 23 MB |
| g++ | random_dag_09 |
|
54 ms | 13 MB |
| g++ | random_dag_dense_00 |
|
67 ms | 13 MB |
| g++ | random_dag_dense_01 |
|
70 ms | 12 MB |
| g++ | random_dag_dense_02 |
|
66 ms | 13 MB |
| g++ | random_dag_dense_03 |
|
70 ms | 12 MB |
| g++ | random_dag_dense_04 |
|
83 ms | 14 MB |
| g++ | random_dense_00 |
|
74 ms | 15 MB |
| g++ | random_dense_01 |
|
69 ms | 14 MB |
| g++ | random_dense_02 |
|
64 ms | 14 MB |
| g++ | random_dense_03 |
|
69 ms | 14 MB |
| g++ | random_dense_04 |
|
78 ms | 13 MB |
| clang++ | example_00 |
|
2 ms | 4 MB |
| clang++ | example_01 |
|
1 ms | 4 MB |
| clang++ | example_02 |
|
2 ms | 4 MB |
| clang++ | long_cycle_00 |
|
299 ms | 77 MB |
| clang++ | long_cycle_01 |
|
185 ms | 55 MB |
| clang++ | random_00 |
|
125 ms | 31 MB |
| clang++ | random_01 |
|
195 ms | 35 MB |
| clang++ | random_02 |
|
103 ms | 16 MB |
| clang++ | random_03 |
|
14 ms | 23 MB |
| clang++ | random_04 |
|
33 ms | 18 MB |
| clang++ | random_05 |
|
134 ms | 28 MB |
| clang++ | random_06 |
|
99 ms | 30 MB |
| clang++ | random_07 |
|
6 ms | 8 MB |
| clang++ | random_08 |
|
110 ms | 23 MB |
| clang++ | random_09 |
|
52 ms | 13 MB |
| clang++ | random_dag_00 |
|
160 ms | 31 MB |
| clang++ | random_dag_01 |
|
156 ms | 34 MB |
| clang++ | random_dag_02 |
|
95 ms | 16 MB |
| clang++ | random_dag_03 |
|
13 ms | 23 MB |
| clang++ | random_dag_04 |
|
32 ms | 18 MB |
| clang++ | random_dag_05 |
|
140 ms | 27 MB |
| clang++ | random_dag_06 |
|
85 ms | 29 MB |
| clang++ | random_dag_07 |
|
6 ms | 8 MB |
| clang++ | random_dag_08 |
|
120 ms | 23 MB |
| clang++ | random_dag_09 |
|
54 ms | 13 MB |
| clang++ | random_dag_dense_00 |
|
67 ms | 13 MB |
| clang++ | random_dag_dense_01 |
|
65 ms | 12 MB |
| clang++ | random_dag_dense_02 |
|
66 ms | 13 MB |
| clang++ | random_dag_dense_03 |
|
67 ms | 12 MB |
| clang++ | random_dag_dense_04 |
|
77 ms | 14 MB |
| clang++ | random_dense_00 |
|
67 ms | 15 MB |
| clang++ | random_dense_01 |
|
66 ms | 14 MB |
| clang++ | random_dense_02 |
|
64 ms | 14 MB |
| clang++ | random_dense_03 |
|
66 ms | 14 MB |
| clang++ | random_dense_04 |
|
77 ms | 13 MB |