二部グラフの最大マッチング:マッチしたエッジの最大数
件名の説明:
RPGの女の子、今日、私たちは、ジェットコースターの夢を取得することができ、最終的に再生するために遊び場に行ってきました。しかし、2つだけの座席の各列のジェットコースターでなく、不文のルールは、すべての女の子が同じお座りを行うには、パートナーと彼女の男の子を見つけなければならないということです。しかし、それぞれの女の子は、放蕩息子または擬似クィアパートナーの海域を行うことがPrincessSnowは喜んで、例えば、ウサギとXHDのみを行うには喜んまたはPQKパートナー、草やlinleのみ行うには喜んまたはLLパートナー、自分のアイデアを持っています。アカウントに財務的影響を考えると、ボス劉はちょうど人々がジェットコースター、他の人は、ちょっと、私は見ての下に立っていた座ってパートナーを見つけるようにすることを決めました。スマートAcmerは、あなたがジェットコースターに乗ることができます組み合わせの最大数を計算することができますか?
説明を入力します。
入力データの最初の行は、それぞれK、M、N-、組み合わせの可能な数、少女、少年の数の数整数3です。0 <K <= 1000
。1 <= N、およびM <= 500次のK行は、各列が2つの数値、パートナーを行うため、それぞれ雄および雌愛のBJ意欲を有しています。最後の入力の0終了。
出力説明:
各試験のために、組み合わせの数を表す出力整数ジェットコースターを座ることができます。
男の子と女の子の数が異なる点に男性と女性の学生を分離する際、女性メートル個人あれば、男性の数は、元のプラスメートルの基本である図を構築し、(男性と女性は違うものですのために)繰り返してもよいので、裸の問題に一致する二部グラフ、すなわち、新しい番号+ mを、そのハンガリー
コード:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int head[N * 2], nex[N * 2], to[N * 2], match[N];
int cnt;
bool vis[N];
void pre_work() {
cnt = 0;
memset(head, -1, sizeof head);
memset(nex, -1, sizeof nex);
memset(match, -1, sizeof match);
memset(vis, false, sizeof vis);
}
void add(int a, int b) {
++cnt;
to[cnt] = b;
nex[cnt] = head[a];
head[a] = cnt;
}
bool dfs(int p) {
for (int i = head[p]; i != -1; i = nex[i]) {
int y = to[i];
if (!vis[y]) {
vis[y] = true;
if (match[y] == -1 || dfs(match[y])) {
match[y] = p;
return true;
}
}
}
return false;
}
int main()
{
ios::sync_with_stdio(0);
int n, m, k;
while (cin >> k && k) {
cin >> m >> n;
pre_work();
for (int i = 0; i < k; i++) {
int a, b;
cin >> a >> b;
add(a, b + m);
add(b + m, a);
}
int res = 0;
for (int i = 1; i <= m; i++) {
memset(vis, false, sizeof vis);
if (dfs(i))++res;
}
cout << res << "\n";
}
return 0;
}