二分图的匹配

本文介绍了二分图匹配的概念,包括匹配点、非匹配点、匹配边和增广路,并重点讲解了求解二分图最大匹配的匈牙利算法。通过实例分析,展示了如何将实际问题转化为二分图匹配问题,如棋盘覆盖、车的放置和导弹防御塔等。同时,还探讨了多重匹配问题的解决策略。
摘要由CSDN通过智能技术生成

二分图的匹配的知识点需要掌握以下几个概念:

1.匹配点、非匹配点、匹配边、非匹配边
2.匹配、最大匹配
3.增广路

求二分图的最大匹配算法:匈牙利算法

其本质就是通过枚举每一个点,尝试找出一条增广路。而每次寻找成功后,必然会使得匹配边数量增加1:可形象地理解为:一个单身狗抢了一个别人的妹子,但是这个人他有备胎,他和备胎又成了一对,而备胎的男友又有备胎,以此类推,最终会使得情侣对数加上1。代码如下:

bool find(int x){
   
    for(int i=head[x];i;i=ne[i]){
   
        int j=to[i];
        if(!st[j]){
   
            st[j]=true;
            if(!match[j] || find(match[j])){
   
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}
//主函数部分
int res=0;
for(int i=1;i<=n1;i++){
   //枚举二分图的一边
    memset(st,false,sizeof st);//每次寻找增广路都要清空判重数组
    if(find(i)) res++;
}
cout<<res<<endl;

把问题转化为二分图匹配问题要关注到题中的两个要素:
0要素:分成的两部分之间没有边相连
1要素:两个点之间仅存在之多一条匹配边

例题1:AcWing 372.棋盘覆盖
这个题目还是巧妙地把问题变成了图论问题,根据题意,我们不妨把骨牌的一半染成白色,另一半染成黑色,而这样整个棋盘就变成黑白相间的了。也就是说任意一个格点的上下左右格点的颜色都与其不同,这与二分图的性质极其相似,那么我们就可以在相邻的两个格点间连边,放一个骨牌就相当于选中了一条边,这样这个问题就完美转化为了二分图的最大匹配问题。代码有些小细节要注意:

#include<iostream>
#include<cstring>
#define x first
#define y second
using namespace std;
const int N=105,M=2*N*N;
int n,m;
bool ban[N][N],st[N][N];
typedef pair<int,i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值