图论模板-二分图最大匹配
定理:
定理1:最大匹配数 = 最小点覆盖数(这是 Konig 定理)
定理2:最大匹配数 = 最大独立数
定理3:最小路径覆盖数 = 顶点数 - 最大匹配数
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//************************************************
const int MAXN=1505;//这个值要超过两边个数的较大者,因为有linker
int linker[MAXN];
bool vis[MAXN];
vector<int>G[MAXN];
int uN;//一边点的数量
bool dfs(int u)
{
for(int i=0;i<G[u].size();i++)
{
if(!vis[G[u][i]])
{
vis[G[u][i]]=true;
if(linker[G[u][i]]==-1||dfs(linker[G[u][i]]))
{
linker[G[u][i]]=u;
return true;
}
}
}
return false;
}
int hungary()
{
int res=0;
memset(linker,-1,sizeof(linker));
for(int u=1;u<=uN;u++)//是否有匹配的点
{
memset(vis,false,sizeof(vis));
if(dfs(u)) res++;
}
return res;
}
int main()
{
while(1)
{
for(int i=1;i<MAXN;++i) G[i].clear();//清空
int k,n,m;cin>>k;if(k==0) break;
cin>>n>>m;
uN=n;
for(int i=1;i<=k;++i)
{
int a,b;cin>>a>>b;
G[a].push_back(b);
}
cout<<hungary()<<endl;
}
}