1. 程式人生 > >hdu 2063 過山車【二分圖】

hdu 2063 過山車【二分圖】

這裡寫圖片描述
題目連結

思路:二分圖匹配
匈牙利演算法(個人理解最優匹配):每次查詢都儘可能匹配,如果這個點的物件已經被匹配了,那就遞迴拆邊,遞迴這個過程保證拆後的點都能匹配才能夠回溯,否則不匹配,開始下一個點。

#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; }