Official

E - アルバイトのシフト割り当て / Part-Time Job Shift Assignment Editorial by sounansya


この問題は二部グラフの最大マッチングを求める問題です。この問題はフローアルゴリズムを用いることで高速に解けることが知られています。最大マッチングとフローの関係については以下の記事に詳しく書かれているので、そちらを参照してください。

最大フローを求めるアルゴリズムは AtCoder Library に用意されているので、そのライブラリを用いることで簡単に実装することができます。

実装例(C++)

#include <atcoder/maxflow>
#include <bits/stdc++.h>
using namespace std;
int main() {
	int n, m;
	cin >> n >> m;
	atcoder::mf_graph<int> g(n + m + 2);
	for (int i = 0; i < n; i++) g.add_edge(n + m, i, 1);
	for (int j = 0; j < m; j++) g.add_edge(n + j, n + m + 1, 1);
	for (int i = 0; i < n; i++) {
		int k;
		cin >> k;
		for (int j = 0; j < k; j++) {
			int c;
			cin >> c;
			c--;
			g.add_edge(i, n + c, 1);
		}
	}
	cout << g.flow(n + m, n + m + 1) << endl;
}

posted:
last update: