Kyopro Library
読み取り中…
検索中…
一致する文字列を見つけられません
bipartite_matching_weighted.hpp
[詳解]
1
#
include
"../../kyopro_library/template.hpp"
2
#
include
"../../kyopro_library/graph/flow/min_cost_flow.hpp"
3
4
/// @brief 重み付き最大二部マッチング(重み最大化)
5
template
<
bool
MAX>
6
struct
BipartiteMatchingWeighted
{
7
MinCostFlow
mcf
;
8
int
start
,
goal
;
9
BipartiteMatchingWeighted
(
int
n):
mcf
(
n
+2),
start
(n),
goal
(n+1) {}
10
vector
<
int
>
left
,
right
;
11
12
/// @brief 左側の頂点 u と右側の頂点 v に重み w の辺を追加する
13
void
add_edge
(
int
u,
int
v, ll w) {
14
left.push_back(u);
15
right.push_back(v);
16
if
(MAX) w=-w;
17
mcf.add_edge(u,v,1,w);
18
}
19
20
/// @brief 頂点 u を左側に追加する
21
void
add_left
(
int
u) { left.push_back(u); }
22
23
/// @brief 頂点 v を右側に追加する
24
void
add_right
(
int
v) { right.push_back(v); }
25
26
/// @brief 重み付き最大二部マッチング問題を解く
27
/// @brief `ret[i] := i 組のマッチングが成立しているときの重み`
28
vector
<
ll
>
solve
() {
29
UQ(left); UQ(right);
30
for
(
int
u: left) mcf.add_edge(start,u,1,0);
31
for
(
int
v: right) mcf.add_edge(v,goal,1,0);
32
33
vector<ll> ret;
34
ret.push_back(0);
35
while
(
true
) {
36
ll res=mcf.flow(start,goal,1);
37
if
(res==
INFL
)
break
;
38
if
(MAX) res=-res;
39
ret.push_back(ret.back()+res);
40
}
41
return
ret;
42
}
43
};
BipartiteMatchingWeighted
重み付き最大二部マッチング(重み最大化)
Definition
bipartite_matching_weighted.hpp:6
BipartiteMatchingWeighted::BipartiteMatchingWeighted
BipartiteMatchingWeighted(int n)
Definition
bipartite_matching_weighted.hpp:9
BipartiteMatchingWeighted::add_left
void add_left(int u)
頂点 u を左側に追加する
Definition
bipartite_matching_weighted.hpp:21
BipartiteMatchingWeighted::left
vector< int > left
Definition
bipartite_matching_weighted.hpp:10
BipartiteMatchingWeighted::mcf
MinCostFlow mcf
Definition
bipartite_matching_weighted.hpp:7
BipartiteMatchingWeighted::right
vector< int > right
Definition
bipartite_matching_weighted.hpp:10
BipartiteMatchingWeighted::add_right
void add_right(int v)
頂点 v を右側に追加する
Definition
bipartite_matching_weighted.hpp:24
BipartiteMatchingWeighted::add_edge
void add_edge(int u, int v, ll w)
左側の頂点 u と右側の頂点 v に重み w の辺を追加する
Definition
bipartite_matching_weighted.hpp:13
BipartiteMatchingWeighted::start
int start
Definition
bipartite_matching_weighted.hpp:8
BipartiteMatchingWeighted::solve
vector< ll > solve()
重み付き最大二部マッチング問題を解く
Definition
bipartite_matching_weighted.hpp:28
BipartiteMatchingWeighted::goal
int goal
Definition
bipartite_matching_weighted.hpp:8
MinCostFlow
最小費用流
Definition
min_cost_flow.hpp:6
INFL
const ll INFL
Definition
template.hpp:13
graph
bipartite_matching_weighted.hpp
構築:
1.13.2