[一般图最大匹配]Bimatching
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的更多相关文章
- UOJ79 一般图最大匹配
题目描述 从前一个和谐的班级,所有人都是搞OI的.有 nn 个是男生,有 00 个是女生.男生编号分别为 1,-,n1,-,n. 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人 ...
- [转]带花树,Edmonds's matching algorithm,一般图最大匹配
看了两篇博客,觉得写得不错,便收藏之.. 首先是第一篇,转自某Final牛 带花树……其实这个算法很容易理解,但是实现起来非常奇葩(至少对我而言). 除了wiki和amber的程序我找到的资料看着都不 ...
- HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力
一般图最大匹配带花树+暴力: 先算最大匹配 C1 在枚举每一条边,去掉和这条边两个端点有关的边.....再跑Edmonds得到匹配C2 假设C2+2==C1则这条边再某个最大匹配中 Boke and ...
- 【Learning】带花树——一般图最大匹配
一般图最大匹配--带花树 问题 给定一个图,求该图的最大匹配.即找到最多的边,使得每个点至多属于一条边. 这个问题的退化版本就是二分图最大匹配. 由于二分图中不存在奇环,偶环对最大匹配并无 ...
- HDU 4687 Boke and Tsukkomi (一般图最大匹配)【带花树】
<题目链接> 题目大意: 给你n个点和m条边,每条边代表两点具有匹配关系,问你有多少对匹配是冗余的. 解题分析: 所谓不冗余,自然就是这对匹配关系处于最大匹配中,即该匹配关系有意义.那怎样 ...
- 【UOJ#79】一般图最大匹配(带花树)
[UOJ#79]一般图最大匹配(带花树) 题面 UOJ 题解 带花树模板题 关于带花树的详细内容 #include<iostream> #include<cstdio> #in ...
- ZOJ 3316 Game 一般图最大匹配带花树
一般图最大匹配带花树: 建图后,计算最大匹配数. 假设有一个联通块不是完美匹配,先手就能够走那个没被匹配到的点.后手不论怎么走,都必定走到一个被匹配的点上.先手就能够顺着这个交错路走下去,最后一定是后 ...
- [WC2016]挑战NPC(一般图最大匹配)
[WC2016]挑战NPC(一般图最大匹配) Luogu 题解时间 思路十分有趣. 考虑一个筐只有不多于一个球才有1的贡献代表什么. 很明显等效于有至少两个位置没有被匹配时有1的贡献. 进而可以构造如 ...
- 【learning】一般图最大匹配——带花树
问题描述 对于一个图\(G(V,E)\),当点对集\(S\)满足任意\((u,v)\in S\),均有\(u,v\in V,(u,v)\in E\),且\(S\)中没有点重复出现,我们称\(S\) ...
随机推荐
- Docker部署NETCORE应用程序
Docker部署NETCORE应用程序 创建.netcore项目,本文以ASP.NET Core2.2 版本为例 设置Dockerfile属性始终复制 编辑Dockerfile内容 FROM micr ...
- Hairpin|Bulge|Loop|假结|共变化(进化)|单序列预测|snRNA|snoRNA|siRNA|microRNA|piRNA|LncRNA|antisense RNAs|cis-NATs|trans-NATs|假基因|环形RNA
生物信息学 GU也可以配对,即“wobble” pairing GU. Hairpin发夹结构,最少不能少于3个碱基.没有配对 Bulge 单侧配对 Loop双侧配对 假结,游离的leading ed ...
- dd if= of= MBR
1.备份分区表信息 sudo fdisk -l >hda.txt #分区表信息重定向输出到文件中 2.备份MBR sudo dd if=/dev/sda of=mbr bs=512 count ...
- GFlags 处理内存越界、野指针问题研究
从官方文档可以看到,从gflags的GUI上,我们是无法判断他打开的是full page heap verification 还是Standard page heap verification, 所以 ...
- 程序员必备:详解XSS和CSRF
做开发的小伙伴想必都不陌生XSS 和 CSRF,但也有一些刚接触的朋友还不是很清楚,今天就给大家详解下XSS和CSRF! 一.XSS xss,即 Cross Site Script,中翻译是跨站脚本攻 ...
- 实验吧web--易--后台登陆
题目地址:http://www.shiyanbar.com/ctf/2036 这道题确实有点考研脑洞了. 1.首先,查看网页源代码(Ctrl+U),会发现一段PHP代码: $sql = "S ...
- Bugku web(1—35)
1.web2 打开网页: 哈哈,其实按下F12你就会发现flag. 2.计算器 打开网页,只是让你输入计算结果,但是发现只能输入一个数字,这时按下F12,修改一下参数,使之可以输入多个数字,修改后输入 ...
- 201612-1 中间数 Java
思路: 先排序,两个count变量记录.有点暴力 import java.util.Arrays; import java.util.Scanner; public class Main { publ ...
- scrapy练习1
1.建立项目: #建立名为tuto的项目 scrapy startproject tuto 2.进入项目目录: cd tuto 3.建立域名任务: #minyan任务名:后面是任务对应的域名 scra ...
- 吴裕雄--天生自然JAVA线程编程笔记:进程与线程