10566 Bimatching

  • 题意:一个男生必须跟两个女生匹配,求最大匹配

  • 思路:一般的二分图匹配做不了,网络流也不会建图,这题采用的是一般图匹配

  • 首先在原来二分图的基础上,将一个男生拆成两个点

  • 两个点之间有一条边,这样图至少会有n个匹配

  • 如果想要答案加1,只有当这两个点跟两个女生匹配的时候

  • 所以最后的答案是一般图最大匹配减去n

  • 一般图最大匹配用带花树

#pragma GCC optimize(3, "Ofast", "inline")

#include<bits/stdc++.h>

using namespace std;
const int maxn = 305;
const int maxm = 50050; struct bloosom {
struct edge {
int to, next;
} e[maxm];
int tot = 0, head[maxn]; inline void add(int u, int v) {
++tot;
e[tot].to = v, e[tot].next = head[u], head[u] = tot;
++tot;
e[tot].to = u, e[tot].next = head[v], head[v] = tot;
} int fa[maxn], tag = 0, pre[maxn], match[maxn], q[maxn], r, fl[maxn];
int vis[maxn], all; int findx(int x) {
if (fa[x] == x)return x;
return fa[x] = findx(fa[x]);
} int lca(int u, int v) {
++tag;
u = findx(u);
v = findx(v);
for (;; swap(u, v)) {
if (u) {
if (fl[u] == tag)return u;
fl[u] = tag;
u = findx(pre[match[u]]);
}
}
} void blo(int u, int v, int l) {
for (; findx(u) != l; v = match[u], u = pre[v]) {
pre[u] = v;
if (vis[match[u]] == 1)vis[q[++r] = match[u]] = 0;
if (findx(u) == u) fa[u] = l;
if (findx(match[u]) == match[u]) fa[match[u]] = l;
}
} bool aug(int s) {
for (int j = 1; j <= all; ++j) {
fa[j] = j;
vis[j] = -1;
}
vis[q[r = 1] = s] = 0;
int x, y;
for (int i = 1; i <= r; ++i) {
for (int j = head[x = q[i]]; j; j = e[j].next) {
if (vis[y = e[j].to] == -1) {
pre[y] = x;
vis[y] = 1;
if (!match[y]) {
for (int u = x, v = y, t; u; v = t, u = pre[v]) {
t = match[u];
match[u] = v;
match[v] = u;
}
return 1;
}
vis[q[++r] = match[y]] = 0;
} else if (!vis[y] && findx(x) != findx(y)) {
int l = lca(x, y);
blo(x, y, l);
blo(y, x, l);
}
}
}
return 0;
} inline void init() {
for (int i = 0; i <= all; ++i) {
pre[i] = match[i] = head[i] = 0;
}
tot = 0;
} int solve() {
int ans = 0;
for (int i = 1; i <= all; ++i) {
if (!match[i]) {
if (aug(i)) ans++;
}
}
return ans;
}
} st; int main() {
int _;
scanf("%d", &_);
while (_--) {
int n, m, s;
scanf("%d%d", &n, &m);
st.all = n * 2 + m;
st.init(); for (int i = 1; i <= n; ++i) {
st.add(i, i + n);
for (int j = 1; j <= m; ++j) {
scanf("%1d", &s);
if (s) {
st.add(i, j + (n << 1));
st.add(i + n, j + (n << 1));
}
}
}
printf("%d\n", st.solve() - n);
}
return 0;
}

[一般图最大匹配]Bimatching的更多相关文章

  1. UOJ79 一般图最大匹配

    题目描述 从前一个和谐的班级,所有人都是搞OI的.有 nn 个是男生,有 00 个是女生.男生编号分别为 1,-,n1,-,n. 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人 ...

  2. [转]带花树,Edmonds's matching algorithm,一般图最大匹配

    看了两篇博客,觉得写得不错,便收藏之.. 首先是第一篇,转自某Final牛 带花树……其实这个算法很容易理解,但是实现起来非常奇葩(至少对我而言). 除了wiki和amber的程序我找到的资料看着都不 ...

  3. HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力

    一般图最大匹配带花树+暴力: 先算最大匹配 C1 在枚举每一条边,去掉和这条边两个端点有关的边.....再跑Edmonds得到匹配C2 假设C2+2==C1则这条边再某个最大匹配中 Boke and ...

  4. 【Learning】带花树——一般图最大匹配

    一般图最大匹配--带花树 问题 ​ 给定一个图,求该图的最大匹配.即找到最多的边,使得每个点至多属于一条边. ​ 这个问题的退化版本就是二分图最大匹配. ​ 由于二分图中不存在奇环,偶环对最大匹配并无 ...

  5. HDU 4687 Boke and Tsukkomi (一般图最大匹配)【带花树】

    <题目链接> 题目大意: 给你n个点和m条边,每条边代表两点具有匹配关系,问你有多少对匹配是冗余的. 解题分析: 所谓不冗余,自然就是这对匹配关系处于最大匹配中,即该匹配关系有意义.那怎样 ...

  6. 【UOJ#79】一般图最大匹配(带花树)

    [UOJ#79]一般图最大匹配(带花树) 题面 UOJ 题解 带花树模板题 关于带花树的详细内容 #include<iostream> #include<cstdio> #in ...

  7. ZOJ 3316 Game 一般图最大匹配带花树

    一般图最大匹配带花树: 建图后,计算最大匹配数. 假设有一个联通块不是完美匹配,先手就能够走那个没被匹配到的点.后手不论怎么走,都必定走到一个被匹配的点上.先手就能够顺着这个交错路走下去,最后一定是后 ...

  8. [WC2016]挑战NPC(一般图最大匹配)

    [WC2016]挑战NPC(一般图最大匹配) Luogu 题解时间 思路十分有趣. 考虑一个筐只有不多于一个球才有1的贡献代表什么. 很明显等效于有至少两个位置没有被匹配时有1的贡献. 进而可以构造如 ...

  9. 【learning】一般图最大匹配——带花树

    问题描述 ​ 对于一个图\(G(V,E)\),当点对集\(S\)满足任意\((u,v)\in S\),均有\(u,v\in V,(u,v)\in E\),且\(S\)中没有点重复出现,我们称\(S\) ...

随机推荐

  1. 浪潮服务器raid5-echo转义说明

    https://jingyan.baidu.com/article/4ae03de3e4c8d33eff9e6bee.html https://wenku.baidu.com/view/3c5dc9a ...

  2. 关于SOA的架构设计案例分析

    SOA体系架构及相关技术,主要应用在企业应用集成领域,它能够以服务的方式共享和复用企业现有应用资产,保护用户IT投资,并能够以服务的方式构建新的业务流程,对企业流程进行灵活重构和优化,增强业务的敏捷性 ...

  3. Hdu_3068 Manacger算法的心得

    关于manacher算法,似乎在学完KMP之后,比较容易上手,虽然有些原理方面,我没有理解的太深. Manacher就是解决回文串的问题,求一个字符串中的最长回文子串. Manacher算法首先对字符 ...

  4. 简单LCS HDU_1503

    学了一下最长公共子串,它是属于dp里面的 dp=max{(i,j-1),(i-1,j),(i-1,j-1)+d}问题,不得不说,规划方向确实厉害,当然这只适用于两个字符串匹配的问题,n个字符串的话,我 ...

  5. Centos7下yum安装软件报错解决办法

    Traceback (most recent call last): File "/usr/bin/yum", line 29, in yummain.user_main(sys. ...

  6. pip速度慢解决办法

    pip速度慢解决办法 sudo pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 注意加不加sudo是 ...

  7. proto3 不支持内建类型的非空判断即 hasXXX

    proto3 移除了内建类型的非空判断方法 即代码生成工具不会为 bool int 等类型生成has方法 有使用过proto2 或者其它rpc 框架的人都知道使用has 方法去判断消息里的值是否设置, ...

  8. python 爬虫下载英语听力新闻(npr news)为mp3格式

    想通过听实时新闻来提高英语听力,学了那么多年的英语,不能落下啊,不然白费背了那么多年的单词. npr news是美国国家公共电台,发音纯正,音频每日更新,以美国为主,世界新闻为辅,比如最近我国武汉发生 ...

  9. 1811 06 pygame 的继续开发

    早上看了  高数和python   好像系统没有保存  桑心啊 关于游戏背景的制作 游戏背景就是    背景在移动  而主人物还在原位置的    常常用于跑酷游戏类  背景开始绘制两张图像  一张完全 ...

  10. share团队冲刺9

    团队冲刺第九天 昨天:完善代码 今天:修改代码中的问题,提高兼容性 问题:无