算法:

從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這個講的很好