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 重み付き最大二部マッチング(重み最大化)
5template<bool MAX>
8 int start, goal;
9 BipartiteMatchingWeighted(int n): mcf(n+2), start(n), goal(n+1) {}
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 組のマッチングが成立しているときの重み`
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};
重み付き最大二部マッチング(重み最大化)
void add_left(int u)
頂点 u を左側に追加する
void add_right(int v)
頂点 v を右側に追加する
void add_edge(int u, int v, ll w)
左側の頂点 u と右側の頂点 v に重み w の辺を追加する
vector< ll > solve()
重み付き最大二部マッチング問題を解く
最小費用流
const ll INFL
Definition template.hpp:13