算法:

从N中的一点开始扩展树,如果找到M中未标记的点(match[i]==-1),

则对此路径取反(即修改原有的match[i],变为另一个与i连接的j点(M中))。

重复此过程。

dfs实现:

/*设二分图的大小分别为m,n,map[m][n]为图的邻接矩阵

match[m]存储了匹配的方案(点集M中的点i匹配N中的match[i]),

初始值为-1.vis[m]记录点是否被扫描果(匹配数)过,res储存结

*/

int dfs(int p)

{

  int i,t;

  for(i=0;i<=n;i++)

    if(map[i][p] && !vis[i])

    {

      vis[i]=1;

      t=match[i];

      match[i]=p;

      if(t==-1 || dfs(t))

          return 1;

      match[i]=t;

    }

  return 0;

}

int main()

{

/*

.....

*/

  int i,res=0;

  for(i=0;i<=n;i++)

  {

      memset(vis,0,sizeof(vis));

      if(dfs(i))

         res++;

  }

  return 0 ;

}

另:

bool 寻找从k出发的对应项出的可增广路
{
while (从邻接表中列举k能关联到顶点j)
{
if (j不在增广路上)
{
把j加入增广路;
if (j是未盖点 或者 从j的对应项出发有可增广路)
{
修改j的对应项为k;
则从k的对应项出有可增广路,返回true;
}
}
}
则从k的对应项出没有可增广路,返回false;
}

void 匈牙利hungary()
{
for i->1 to n
{
if (则从i的对应项出有可增广路)
匹配数++;
}
输出 匹配数;
}

http://hi.baidu.com/nash635/blog/item/285e0a016e306305728da5e0.html这个讲的很好