题目链接:http://poj.org/problem?id=3041
题意:求二分图最大匹配。
思路:直接手搓了一份匈牙利算法的模版,练习一下吧。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=505;
int T,n,m,k;
int line[maxn][maxn];
int girl[maxn];
bool used[maxn];
bool dfs(int x){
for(int i=1;i<=n;i++){
if(line[x][i]&&!used[i]){
used[i]=1;
if(!girl[i]||dfs(girl[i])){
girl[i]=x;
return true;
}
}
}
return false;
}
int hungary(){
int ans=0;
memset(girl,0,sizeof(girl));
for(int i=1;i<=n;i++){
memset(used,0,sizeof(used));
if(dfs(i))
ans++;
}
return ans;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
#endif
while(~scanf("%d%d",&n,&k)){
memset(line,0,sizeof(line));
int a,b;
for(int i=0;i<k;i++){
scanf("%d%d",&a,&b);
line[a][b]=1;
}
int ans=hungary();
printf("%d\n",ans);
}
return 0;
}