hdu 2063 過山車【二分圖】
阿新 • • 發佈:2019-02-09
思路:二分圖匹配
匈牙利演算法(個人理解最優匹配):每次查詢都儘可能匹配,如果這個點的物件已經被匹配了,那就遞迴拆邊,遞迴這個過程保證拆後的點都能匹配才能夠回溯,否則不匹配,開始下一個點。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define max_n 510
using namespace std;
int mapp[max_n][max_n];
int used[max_n], girl[max_n];
int p1, p2, n, m, k;
bool dfs(int x) {
for(int i = 1; i<= m; i++) {
if(mapp[x][i] && !used[i]) {
used[i] = 1;
if(!girl[i] || dfs(girl[i])) {
girl[i] = x;
return 1;
}
}
}
return 0;
}
int main() {
while(scanf("%d", &k) && k) {
memset (mapp, 0, sizeof(mapp));
memset(girl, 0, sizeof(girl)); //表示漢子對應的妹子編號
scanf("%d %d", &n, &m);
for(int i = 0; i < k; i++) {
scanf("%d %d", &p1, &p2);
mapp[p1][p2] = 1;
}
int ans = 0;
for(int i = 1; i <= n; i++) {
memset (used, 0, sizeof(used));
if(dfs(i)) ans++;
}
printf("%d\n", ans);
}
return 0;
}