Kyopro Library
読み取り中…
検索中…
一致する文字列を見つけられません
moyasu_umeru.hpp
[詳解]
1
#
include
"../../../kyopro_library/template.hpp"
2
3
#
include
<
atcoder
/
maxflow
>
4
5
/// @brief 燃やす埋める
6
template
<
typename
Cost>
7
struct
BurningBurying
{
8
BurningBurying
(
int
n) {
9
this
->n=n;
10
start=n;
11
goal=n+1;
12
mf=atcoder::mf_graph<Cost>(n+2);
13
}
14
15
/// @brief x[i] = 0 のときコスト zero, x[i] = 1 のときコスト one がかかるという条件を追加する
16
void
add_single
(
int
i, Cost zero, Cost one) {
17
if
(zero<=one) {
18
//基本コストがzeroで、iを0から1に変えると+one-zeroされる
19
offset+=zero;
20
mf.add_edge(start,i,one-zero);
21
}
else
{
22
//基本コストがoneで、iを1から0に変えると-one+zeroされる
23
offset+=one;
24
mf.add_edge(i,goal,zero-one);
25
}
26
}
27
28
/**
29
* @brief
30
* x[ i ], x[ j ] の組み合わせについて、以下のコストかかるという条件を追加する
31
* | | x[j] = 0 | x[j] = 1 |
32
* | --- | --- | --- |
33
* | x[i] = 0 | a | b |
34
* | x[i] = 1 | c | d |
35
*
36
* @attention b + c >= a + d を要求する
37
*/
38
void
add_double
(
int
i,
int
j, Cost a, Cost b, Cost c, Cost d) {
39
assert(b+c>=a+d);
40
offset+=a;
41
add_single
(
i
,
0
,
c-a
)
;
42
add_single
(
j
,
0
,
d-c
)
;
43
mf.add_edge(i,j,b+c-a-d);
44
}
45
46
/// @brief コスト最小値を求める
47
Cost
solve
() {
return
mf.flow(start,goal)+offset; }
48
49
private
:
50
int
n,start,goal;
51
Cost offset=0;
52
atcoder::mf_graph<Cost> mf;
53
};
BurningBurying
燃やす埋める
Definition
moyasu_umeru.hpp:7
BurningBurying::BurningBurying
BurningBurying(int n)
Definition
moyasu_umeru.hpp:8
BurningBurying::add_double
void add_double(int i, int j, Cost a, Cost b, Cost c, Cost d)
x[ i ], x[ j ] の組み合わせについて、以下のコストかかるという条件を追加する
Definition
moyasu_umeru.hpp:38
BurningBurying::solve
Cost solve()
コスト最小値を求める
Definition
moyasu_umeru.hpp:47
BurningBurying::add_single
void add_single(int i, Cost zero, Cost one)
x[i] = 0 のときコスト zero, x[i] = 1 のときコスト one がかかるという条件を追加する
Definition
moyasu_umeru.hpp:16
graph
flow
moyasu_umeru.hpp
構築:
1.13.2