This documentation is automatically generated by online-judge-tools/verification-helper
#include "src/graph/class/dynamic-graph.hpp"
DynamicGraph< edge >(usize n)
頂点数 n
のグラフを定義する。
edge
の制約cost_type
が公開されていること。from
, to
, cost
, id
をもつこと。また、この順にコンストラクタを呼べること。usize size()
グラフの頂点数を返す。
void add_directed_edge(usize from, usize to, cost_type cost = 1)
from
から to
へのコストcost
の有向辺をグラフに追加する。 cost
を指定しなかった場合、その辺のコストは 1 になる。
辺には追加された順に 0-indexed で辺番号が割り振られる。
void add_undirected_edge(usize u, usize v, cost_type cost = 1)
u
から v
へのコスト cost
の無向辺をグラフに追加する。 cost
を指定しなかった場合、その辺のコストは 1 になる。
辺には追加された順に 0-indexed で辺番号が割り振られる。
(1) Edges &operator[](const usize &v)
(2) const Edges &operator[](const usize &v) const
v
を始点とする辺のリストを返す。
#pragma once
#include "src/cpp-template/header/size-alias.hpp"
#include <cassert>
#include <vector>
namespace luz {
template < typename Edge >
class DynamicGraph {
using Edges = std::vector< Edge >;
protected:
std::vector< Edges > g;
usize edge_count;
public:
using cost_type = typename Edge::cost_type;
DynamicGraph() = default;
explicit DynamicGraph(usize n): g(n), edge_count(0) {}
usize size() const {
return g.size();
}
void add_directed_edge(usize from, usize to, cost_type cost = 1) {
assert(from < size());
assert(to < size());
g[from].emplace_back(from, to, cost, edge_count++);
}
void add_undirected_edge(usize u, usize v, cost_type cost = 1) {
assert(u < size());
assert(v < size());
assert(u != v);
g[u].emplace_back(u, v, cost, edge_count);
g[v].emplace_back(v, u, cost, edge_count++);
}
Edges operator[](const usize &v) {
return g[v];
}
const Edges operator[](const usize &v) const {
return g[v];
}
};
} // namespace luz
#line 2 "src/graph/class/dynamic-graph.hpp"
#line 2 "src/cpp-template/header/size-alias.hpp"
#include <cstddef>
namespace luz {
using isize = std::ptrdiff_t;
using usize = std::size_t;
} // namespace luz
#line 4 "src/graph/class/dynamic-graph.hpp"
#include <cassert>
#include <vector>
namespace luz {
template < typename Edge >
class DynamicGraph {
using Edges = std::vector< Edge >;
protected:
std::vector< Edges > g;
usize edge_count;
public:
using cost_type = typename Edge::cost_type;
DynamicGraph() = default;
explicit DynamicGraph(usize n): g(n), edge_count(0) {}
usize size() const {
return g.size();
}
void add_directed_edge(usize from, usize to, cost_type cost = 1) {
assert(from < size());
assert(to < size());
g[from].emplace_back(from, to, cost, edge_count++);
}
void add_undirected_edge(usize u, usize v, cost_type cost = 1) {
assert(u < size());
assert(v < size());
assert(u != v);
g[u].emplace_back(u, v, cost, edge_count);
g[v].emplace_back(v, u, cost, edge_count++);
}
Edges operator[](const usize &v) {
return g[v];
}
const Edges operator[](const usize &v) const {
return g[v];
}
};
} // namespace luz