不得不說,如果以現實角度代入此演算法的理解,就合理了很多,雖然有悖道德準則
重點在於以下幾點
- 每次給女生分配男生前,都把男生全部初始化為可預定狀態(即使他已經被別人成功匹配了)
- 在所有女生中意的男生中遍歷,如果發現該男生可預訂就先預定,然後看他是否已經有主了,如果有主了,就
dfs(match[i])
,(跟當前那個匹配這個男生的女生商量能不能換,此時 dfs 進去,該男生預定狀態是還在的,所以不會出岔子),當然這一步正經來說叫尋找增廣路
然後是程式碼:
點選檢視程式碼
int n, m;
int match[N], reserve[N];
int G[510][510];
bool dfs(int u){
// u For Girl, i For Boy;
for(int i = 1; i <= m; i++){
if(!reserve[i] && G[u][i]){
reserve[i] = 1;
if(!match[i] || dfs(match[i])){
match[i] = u;
return true;
}
}
}
return false;
}
由於匈牙利演算法是O(nm)的,所以直接用鄰接矩陣存圖就好了