算法:
从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这个讲的很好