二分图匹配主要是建图方法,有行列匹配法,黑白染色法,反建法,拆点法,拆行拆列法..
下面是poj 3041的代码,行列匹配...
//匈牙利算法,求二分图的最大基数匹配
//动态存边时间复杂度O(nm),矩阵的话时间复杂度O(n^3)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define maxv 1005
vector<int> edge[maxv];
int n,m,k;
bool used[maxv];
int match[maxv];
void init()
{
int i,l,r;
// cin>>n>>m;
memset(match,0,sizeof(match));
for(i=1;i<=n;++i)
edge[i].clear();
for(i=0;i<k;++i)
{
cin>>l>>r;
edge[l].push_back(r);
}
}
bool GetAugPath(int s)
{
int i,t;
for(i=0;i<edge[s].size();++i)
{
t=edge[s][i];
if(!used[t])
{
used[t]=true;
if(match[t]==0||GetAugPath(match[t]))
{
match[t]=s;
return true;
}
}
}
return false;
}
int work()
{
init();
int i,ans=0;
for(i=1;i<=n;++i)
{
memset(used,0,sizeof(used));
if(GetAugPath(i))
ans++;
}
// cout<<"done"<<endl;
return ans;
}
int main()
{
int i,l,r;
while(cin>>n>>k)
{
m=n;
cout<<work()<<endl;
}
return 0;
}