一直在做题。。然而算法博客鸽了一篇又一篇。。。
这一篇可能会是开始补博客的开端???
二分图
众所周知,(???)二分图是可以分成两个部分的图,只有在两个部分之间有连边,在同一个部分内没有边
例如下面这张图就是二分图
(并没有,回家补)
而这个并不是二分图
(也没有,回家补)
那么锌的问题来了
二分图匹配又是求什么的呢?
匹配
关于匹配,最应该想到的是男男和女女分别配对男女配对是吧
例如下面这道题
你是一个班级的班长,性别男,你知道所有班级内所有男生的所有暗恋对象,你的目标是安排座位使得最多的男生得到满足
(好像哪里不太对??)
(下面需要图片说明先鸽了)
这就是我们要的匈牙利算法!
模版
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座位安排