Skip to content

Commit 04e623c

Browse files
committed
Remove "all" files, add basic graph template
1 parent 4391037 commit 04e623c

File tree

14 files changed

+153
-66
lines changed

14 files changed

+153
-66
lines changed

cp-algo/all

Lines changed: 0 additions & 15 deletions
This file was deleted.

cp-algo/data_structures/all

Lines changed: 0 additions & 6 deletions
This file was deleted.

cp-algo/data_structures/segtree/all

Lines changed: 0 additions & 5 deletions
This file was deleted.

cp-algo/data_structures/segtree/metas/all

Lines changed: 0 additions & 6 deletions
This file was deleted.

cp-algo/data_structures/treap/all

Lines changed: 0 additions & 5 deletions
This file was deleted.

cp-algo/data_structures/treap/metas/all

Lines changed: 0 additions & 5 deletions
This file was deleted.

cp-algo/geometry/all

Lines changed: 0 additions & 6 deletions
This file was deleted.

cp-algo/graph/base.hpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#ifndef CP_ALGO_GRAPH_BASE_HPP
2+
#define CP_ALGO_GRAPH_BASE_HPP
3+
#include <iostream>
4+
#include <ranges>
5+
#include <vector>
6+
namespace cp_algo::graph {
7+
enum type {directed = 0, undirected = 1};
8+
template<type undirected>
9+
struct graph {
10+
graph(size_t n, size_t v0 = 0): n(n), v0(v0), adj(n) {}
11+
12+
void add_edge(size_t u, size_t v) {
13+
adj[u - v0].push_back(size(to));
14+
to.push_back(v - v0);
15+
if constexpr (undirected) {
16+
adj[v - v0].push_back(size(to));
17+
}
18+
to.push_back(u - v0);
19+
}
20+
void read_edges(size_t m) {
21+
for(size_t i = 0; i < m; i++) {
22+
int u, v;
23+
std::cin >> u >> v;
24+
add_edge(u, v);
25+
}
26+
}
27+
auto adjacent_generator(size_t v) const {
28+
return [&adj = adj[v], idx = 0]() mutable {
29+
return idx < ssize(adj) ? adj[idx++] : -1;
30+
};
31+
}
32+
auto nodes_view() const {
33+
return std::views::iota((size_t)0, n);
34+
}
35+
36+
size_t n;
37+
size_t v0;
38+
std::vector<size_t> to;
39+
std::vector<std::vector<size_t>> adj;
40+
};
41+
}
42+
#endif // CP_ALGO_GRAPH_BASE_HPP

cp-algo/graph/cycle.hpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#ifndef CP_ALGO_GRAPH_CYCLE_HPP
2+
#define CP_ALGO_GRAPH_CYCLE_HPP
3+
#include "base.hpp"
4+
#include <algorithm>
5+
#include <vector>
6+
namespace cp_algo::graph {
7+
std::vector<size_t> find_cycle(auto const& g) {
8+
std::vector<char> state(g.n);
9+
std::vector<size_t> cycle;
10+
auto dfs = [&](auto self, size_t v, size_t pe) -> bool {
11+
state[v] = 1;
12+
auto gen = g.adjacent_generator(v);
13+
for(size_t e = gen(); ~e; e = gen()) {
14+
if(e / 2 != pe / 2) {
15+
auto u = g.to[e];
16+
if(state[u] == 0) {
17+
if(self(self, u, e)) {
18+
if(g.to[cycle[0]] != g.to[cycle.back() ^ 1]) {
19+
cycle.push_back(e);
20+
}
21+
return true;
22+
}
23+
} else if(state[u] == 1) {
24+
cycle = {e};
25+
return true;
26+
}
27+
}
28+
}
29+
state[v] = 2;
30+
return false;
31+
};
32+
for(size_t i: g.nodes_view()) {
33+
if(!state[i] && dfs(dfs, i, -1)) {
34+
break;
35+
}
36+
}
37+
std::ranges::reverse(cycle);
38+
return cycle;
39+
}
40+
}
41+
#endif // CP_ALGO_GRAPH_CYCLE_HPP

cp-algo/linalg/all

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)