Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
moyasu_umeru.hpp
[詳解]
1#include"../../../kyopro_library/template.hpp"
2
3#include<atcoder/maxflow>
4
5/// @brief 燃やす埋める
6template<typename Cost>
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
49private:
50 int n,start,goal;
51 Cost offset=0;
52 atcoder::mf_graph<Cost> mf;
53};
燃やす埋める
BurningBurying(int n)
void add_double(int i, int j, Cost a, Cost b, Cost c, Cost d)
x[ i ], x[ j ] の組み合わせについて、以下のコストかかるという条件を追加する
Cost solve()
コスト最小値を求める
void add_single(int i, Cost zero, Cost one)
x[i] = 0 のときコスト zero, x[i] = 1 のときコスト one がかかるという条件を追加する