Weighted matroid intersection using Dijkstra's algorithm
(combinatorial_opt/matroid_intersection_dijkstra.hpp)
重み付きマトロイド交叉(交差)問題 (matroid intersection) のソルバ.二つのマトロイド $M_{1} = (E, \mathcal{I}_{1}), M_{2} = (E, \mathcal{I}_{2})$ とそのサイズ $k$ 最大重み共通独立集合 $I_k$ ,および $I_k$ の導出に使われたポテンシャルを入力とし,サイズ $k + 1$ の最大重み共通独立集合を求めるか,これが存在しないことを示す.引数として与えたポテンシャルは適宜更新される.
計算量は $n = |E|$,マトロイドクラスのサーキットクエリ一回あたりの計算量を $c$ として $O(nc + nk \log n)$ である.ポテンシャルの利用により内部で解く最短経路問題の辺重みを全て非負にでき,高速な Dijkstra 法を利用できる.
使用方法
UserDefinedMatroid m1, m2;
vector<T> weight(n);
vector<T> potential(n + 2); // 2 個の補助頂点のポテンシャルの情報も持つ
vector<bool> I(n);
assert(m1.size() == n);
assert(m2.size() == n);
while (augment_matroid_intersection_dijkstra(m1, m2, I, weight, potential)) {
continue;
}
問題例
文献・リンク集
- [1] C. Brezovec, G. Cornuéjols, and F. Glover, “Two algorithms for weighted matroid intersection,”
Mathematical Programming, 36(1), 39-53, 1986.
Verified with
Code
Back to top page