#define N 501
int useif[N]; //记录y中节点是否使用
int link[N]; //记录当前与y节点相连的x的节点
int mat[N][N]; //记录连接x和y的边,如果i和j之间有边则为,否则为
int gn,gm; //二分图中x和y中点的数目
int can(int t)
{
int i;
for(i=1;i<=gm;i++)
{
if(useif[i]==0 && mat[t][i])
{
useif[i]=1;
if(link[i]==-1 || can(link[i]))
{
link[i]=t;
return 1;
}
}
}
return 0;
}
int MaxMatch()
{
int i,num;
num=0;
memset(link,-1,sizeof(link));
for(i=1;i<=gn;i++)
{
memset(useif,0,sizeof(useif));
if(can(i)) num++;
}
return num;
}
采用邻接矩阵来存放二分图比较方便,若集合X中的i和集合Y中的j有边相连,则令mat[i][j]=1,link[j]来记录与当前的Y集合中j匹配的点,若没有匹配则值为-1,MaxMatch()中的循环对X中的元素逐个访问,从第一个元素开始can()再对Y中的元素开始逐一检查,看是否有于t相连的点,找到一个点后,用useif[]来记录在这一轮中这个点以用过,这样就相当于找到了一个匹配,当X中的另外一个点也与这个点相连时注意到link[j]不为-1,这样就再次从与之相连的X中的点出发,这就是一个DFS的过程,直至找到link[]=-1
代码出处http://old.blog.edu.cn/user3/Hailer/archives/2007/1829623.shtml