Skip to content

Commit ad83228

Browse files
committed
Factor out edge types
1 parent 91457d6 commit ad83228

File tree

2 files changed

+48
-42
lines changed

2 files changed

+48
-42
lines changed

cp-algo/graph/base.hpp

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,11 @@
11
#ifndef CP_ALGO_GRAPH_BASE_HPP
22
#define CP_ALGO_GRAPH_BASE_HPP
3+
#include "edge_types.hpp"
34
#include "../data_structures/stack_union.hpp"
4-
#include <iostream>
55
#include <ranges>
66
#include <vector>
77
namespace cp_algo::graph {
8-
using node_index = int;
98
using edge_index = int;
10-
struct edge_base {
11-
node_index to;
12-
13-
edge_base() {}
14-
edge_base(node_index v): to(v) {}
15-
16-
static auto read(node_index v0 = 0) {
17-
node_index u, v;
18-
std::cin >> u >> v;
19-
return std::pair{u - v0, edge_base(v - v0)};
20-
}
21-
22-
edge_base backedge(int from) const {
23-
return {from};
24-
}
25-
};
26-
27-
struct weighted_edge: edge_base {
28-
int64_t w;
29-
30-
weighted_edge() {}
31-
weighted_edge(node_index v, int64_t w): edge_base(v), w(w) {}
32-
33-
static auto read(node_index v0 = 0) {
34-
node_index u, v;
35-
int64_t w;
36-
std::cin >> u >> v >> w;
37-
return std::pair{u - v0, weighted_edge{v - v0, w}};
38-
}
39-
40-
weighted_edge backedge(node_index from) const {
41-
return {from, w};
42-
}
43-
};
44-
45-
template<typename edge>
46-
concept edge_type = std::is_base_of_v<edge_base, edge>;
47-
template<typename edge>
48-
concept weighted_edge_type = std::is_base_of_v<weighted_edge, edge>;
49-
509
enum type {directed = 0, undirected = 1};
5110
template<type _undirected, edge_type edge_t = edge_base>
5211
struct graph {

cp-algo/graph/edge_types.hpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#ifndef CP_ALGO_GRAPH_EDGE_TYPES_HPP
2+
#define CP_ALGO_GRAPH_EDGE_TYPES_HPP
3+
#include <iostream>
4+
#include <cstdint>
5+
namespace cp_algo::graph {
6+
using node_index = int;
7+
struct edge_base {
8+
node_index to;
9+
10+
edge_base() {}
11+
edge_base(node_index v): to(v) {}
12+
13+
static auto read(node_index v0 = 0) {
14+
node_index u, v;
15+
std::cin >> u >> v;
16+
return std::pair{u - v0, edge_base(v - v0)};
17+
}
18+
19+
edge_base backedge(int from) const {
20+
return {from};
21+
}
22+
};
23+
24+
struct weighted_edge: edge_base {
25+
int64_t w;
26+
27+
weighted_edge() {}
28+
weighted_edge(node_index v, int64_t w): edge_base(v), w(w) {}
29+
30+
static auto read(node_index v0 = 0) {
31+
node_index u, v;
32+
int64_t w;
33+
std::cin >> u >> v >> w;
34+
return std::pair{u - v0, weighted_edge{v - v0, w}};
35+
}
36+
37+
weighted_edge backedge(node_index from) const {
38+
return {from, w};
39+
}
40+
};
41+
42+
template<typename edge>
43+
concept edge_type = std::is_base_of_v<edge_base, edge>;
44+
template<typename edge>
45+
concept weighted_edge_type = std::is_base_of_v<weighted_edge, edge>;
46+
}
47+
#endif // CP_ALGO_GRAPH_EDGE_TYPES_HPP

0 commit comments

Comments
 (0)