圖論-二分圖匹配匈牙利演算法

9102700發表於2024-05-24

不得不說,如果以現實角度代入此演算法的理解,就合理了很多,雖然有悖道德準則

重點在於以下幾點

  • 每次給女生分配男生前,都把男生全部初始化為可預定狀態(即使他已經被別人成功匹配了)
  • 在所有女生中意的男生中遍歷,如果發現該男生可預訂就先預定,然後看他是否已經有主了,如果有主了,就 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)的,所以直接用鄰接矩陣存圖就好了

相關文章