算法:
從N中的一點開始擴展樹,如果找到M中未標記的點(match[i]==-1),
則對此路徑取反(即修改原有的match[i],變?yōu)榱硪粋€與i連接的j點(M中))。
重復(fù)此過程。
dfs實現(xiàn):
/*設(shè)二分圖的大小分別為m,n,map[m][n]為圖的鄰接矩陣
match[m]存儲了匹配的方案(點集M中的點i匹配N中的match[i]),
初始值為-1.vis[m]記錄點是否被掃描果(匹配數(shù))過,res儲存結(jié)
*/
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出發(fā)的對應(yīng)項出的可增廣路
{
while (從鄰接表中列舉k能關(guān)聯(lián)到頂點j)
{
if (j不在增廣路上)
{
把j加入增廣路;
if (j是未蓋點 或者 從j的對應(yīng)項出發(fā)有可增廣路)
{
修改j的對應(yīng)項為k;
則從k的對應(yīng)項出有可增廣路,返回true;
}
}
}
則從k的對應(yīng)項出沒有可增廣路,返回false;
}
void 匈牙利hungary()
{
for i->1 to n
{
if (則從i的對應(yīng)項出有可增廣路)
匹配數(shù)++;
}
輸出 匹配數(shù);
}
http://hi.baidu.com/nash635/blog/item/285e0a016e306305728da5e0.html這個講的很好