匈牙利算法模板(二分图)

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;
}
posted @ 2024-05-12 15:01  晨曦ccx  阅读(23)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end