二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
算法轮廓:
- 置 M 为空;
- 找出一条增广路径,通过异或操作获得更大的匹配 M' 代替 M;
- 重复步骤 2 直到找不出增广路径为止。
#include
#include
using namespace std;
#define max 510
int match[max][max];
int link[max];
bool used[max];
int k,n,m;
bool dfs(int u) //深搜遍历,寻找增广路径
{
for(int v=1;v<=n;v++)
{
if(match[u][v]&&!used[v])
{
used[v]=true;
if(link[v]==-1||dfs(link[v]))
{
link[v]=u;
return true;
}
}
}
return false ;
}
int Xiong()
{
int res=0;
memset(link,-1,sizeof(link));
for(int i=1;i<=m;i++)
{
memset(used,false,sizeof(used));
if(dfs(i))
res++; //找到增广路径则匹配数加1
}
return res;
}
int main()
{
int x,y;
while(cin>>k&&k)
{
memset(match,0,sizeof(match));
cin>>m>>n;
for(int i=1;i<=k;i++)
{
cin>>x>>y;
match[x][y]=1;
}
cout<