通俗易懂的:http://ekumen.iteye.com/blog/265336
模板:http://chhaj5236.blog.163.com/blog/static/1128810812009910102617216/
Ford-Fulkerson求解最大流 Edmonds-Karp算法:http://chhaj5236.blog.163.com/blog/static/112881081200982835124243/
说下什么叫匹配,以及和匹配相关的一些概念,匹配就是一些边的集合,这些边没有公共顶点,举个例子,就是飞机场有n个驾驶员,有一部分驾驶员之间是互相认识的,飞机需要两个互相认识的驾驶员才能起飞,一个驾驶员只能上一个飞机,求能起飞的最大飞机架数,那么我们只要让认识的飞行员之间相互连边,然后就成了选出最多的不相交的边了,就成了最大匹配,那么由于这个图是一般图,需要用带花树算法,很复杂,应用就不多做要求,但是,如果人里面有一些正驾驶,副驾驶,飞机需要一正一副而且认识才能起飞,显然就成为了一个二分图的最大匹配问题
#include <stdio.h>
#include <iostream>
using namespace std;
const int maxn=501;
int match[maxn];
int map[maxn][maxn];
bool v[maxn];
int n,m;
int dfs(int p){
for(int i=1;i<=n;i++){
if(map[p][i]&&!v[i]){
v[i]=1;
if(match[i]==-1||dfs(match[i])){
match[i]=p;
return 1;
}
}
}
return 0;//莫漏
}
int Hungry(){
int i;
int ans=0;
for(i=1;i<=n;i++){
memset(v,0,sizeof(v));
if(dfs(i))
ans++;
}
return ans;
}
int main(){
int i,j,k;
cin>>n>>k;
for(m=1;m<=k;m++){
cin>>i>>j;
map[i][j]=1;
}
memset(match,-1,sizeof(match));
cout<<Hungry()<<endl;
system("PAUSE");
return 0;
}