Please sign in first.
Official
E - アルバイトのシフト割り当て / Part-Time Job Shift Assignment Editorial
by
E - アルバイトのシフト割り当て / Part-Time Job Shift Assignment Editorial
by
sounansya
この問題は二部グラフの最大マッチングを求める問題です。この問題はフローアルゴリズムを用いることで高速に解けることが知られています。最大マッチングとフローの関係については以下の記事に詳しく書かれているので、そちらを参照してください。
最大フローを求めるアルゴリズムは AtCoder Library に用意されているので、そのライブラリを用いることで簡単に実装することができます。
#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:
