匈牙利演算法模板(二分圖)

晨曦ccx發表於2024-05-12
bool dfs(int now){
    for(int i=h[now];i;i=nxt[i]){
        int t=to[i];
        //這裡不用考慮會有回到父結點的邊的問題
        //因為每次都是從左部找鄰接點
        if(!vis[t]){
            vis[t]=true;
            //如果鄰接點t是非匹配點,則找到一條增廣路,匹配
            //如果t已匹配過,但是能重新匹配,則也找到一條增廣路
            //讓t與now匹配
            if(!match[t]||dfs(match[t])){
                match[t]=now;
                return true;
            }
        }
    }
    return false;
}
//匈牙利演算法求最大匹配
int xyl(){
    int ans=0;// 記錄最大匹配數
    for(int i=1;i<=n;i++){
        memset(vis,false,sizeof(vis));
        //找到一條增廣路,匹配數+1
        if(dfs(i)) ans++;
    }
    return ans;
}

相關文章