二分图匹配

一直在做题。。然而算法博客鸽了一篇又一篇。。。
这一篇可能会是开始补博客的开端???

二分图

众所周知,(???)二分图是可以分成两个部分的图,只有在两个部分之间有连边,在同一个部分内没有边
例如下面这张图就是二分图
(并没有,回家补)
而这个并不是二分图
(也没有,回家补)

那么锌的问题来了
二分图匹配又是求什么的呢?

匹配

关于匹配,最应该想到的是男男和女女分别配对男女配对是吧
例如下面这道题

你是一个班级的班长,性别男,你知道所有班级内所有男生的所有暗恋对象,你的目标是安排座位使得最多的男生得到满足
(好像哪里不太对??)

(下面需要图片说明先鸽了)

这就是我们要的匈牙利算法!
模版

int mcx[MAXN],mcy[MAXN];
bool vis[MAXN];
int dfs(int x) {
    for (int i = head[x]; i ; i = edge[i].nxt){     //这里是链式前向星的图的遍历方式
        int v = edge[i].v;
        if (! vis[v]) {
            vis[v] = true;
            if (! mcy[v] || dfs(mcy[v])) {         //借用c++特性,如果第一个条件满足则不查第二个条件
                mcx[x] = v;
                mcy[v] = x;
                return 1;
            }
        }
    }
    return 0;
}
int match(){
	int ans=0;
	for (int i=1; i<=n*2; i++) {
        memset(vis,0,sizeof(vis));
        ans+=dfs(i);
    }
    return ans;
}

当然二分图匹配也可以用网络流来做
请自行思考如何建边

练习:
luoguP3386模版
luoguP2319超级英雄
luoguP2071座位安排

posted @ 2018-09-26 16:42  smallshulker  阅读(184)  评论(0编辑  收藏  举报