HDU T2063 过山车
题解:
二分图匹配(匈牙利算法)裸题,主要思想是递归拆边,不懂二分图匹配的可以先看看其它大牛的讲解,鄙人后期补上。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 505;
int k,n,m,g[MAXN];
bool line[MAXN][MAXN],used[MAXN];
bool find(int x){
for(int i = 1; i <= m; ++i){
if(line[x][i] && !used[i]){//如果有暧昧并且还没有标记过
used[i] = true;
if(g[i] == 0 || find(g[i])){//名花无主或者能腾出个位置来,递归思想
g[i] = x;
return true;
}
}
}
return false;
}
int match(){
int sum = 0;
for(int i = 1; i <= n ;++i){
memset(used,false,sizeof(used)); //每次更新,以确保二分图的最大匹配
if(find(i))
sum++;
}
return sum;
}
int main(){
int u,v;
while(cin >> k && k){
cin >> n >> m;
memset(g,0,sizeof(g));
memset(line,false,sizeof(line));
for(int i = 0; i < k ;++i){
cin >> u >> v;
line[u][v] = true;
}
cout << match() << endl;
}
return 0;
}