[bzoj4405][wc2016]挑战NPC
来自FallDream的博客,未经允许,请勿转载,谢谢。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MN 600
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int head[MN+],vis[MN+],cnt=,n,m,Q,q[MN*MN],now=,mark[MN+],match[MN+],ne[MN+],fa[MN+],top,tail;
struct edge{int to,ne;}e[MN*MN+];
inline int getfa(int x){return !fa[x]?x:fa[x]=getfa(fa[x]);}
inline void ins(int f,int t)
{
e[++cnt]=(edge){t,head[f]};head[f]=cnt;
e[++cnt]=(edge){f,head[t]};head[t]=cnt;
} int Lca(int x,int y)
{
++now;
for(;;swap(x,y))
if(x!=-)
{
x=getfa(x);
if(vis[x]==now) return x;
vis[x]=now;
if(match[x]) x=ne[match[x]];
else x=-;
}
} void Unit(int x,int y)
{
x=getfa(x);y=getfa(y);
if(x!=y) fa[x]=y;
} void group(int a,int p)
{
for(;a!=p;)
{
int b=match[a],c=ne[b];
if(getfa(c)!=p) ne[c]=b;
if(mark[b]==) mark[q[++top]=b]=;
if(mark[c]==) mark[q[++top]=c]=;
Unit(a,b);Unit(b,c);
a=c;
}
} void Solve(int x)
{
for(int i=;i<=n+*m;++i) ne[i]=fa[i]=mark[i]=vis[i]=;
mark[x]=;q[top=tail=]=x;
for(;!match[x]&&top>=tail;++tail)
{
int y=q[tail];
for(int i=head[y];i;i=e[i].ne)
{
int v=e[i].to;
if(match[y]==v||mark[v]==||getfa(y)==getfa(v)) continue;
if(mark[v]==)
{
int lca=Lca(y,v);
if(getfa(y)!=lca) ne[y]=v;
if(getfa(v)!=lca) ne[v]=y;
group(y,lca);
group(v,lca);
}
else if(!match[v])
{
ne[v]=y;
for(int u=v;u;)
{
int w=ne[u],ww=match[w];
match[w]=u,match[u]=w;
u=ww;
}
return;
}
else
{
ne[v]=y;
mark[q[++top]=match[v]]=;
mark[v]=;
}
}
}
} int main()
{
for(int T=read();T;--T)
{
memset(head,,sizeof(head));
memset(match,,sizeof(match));cnt=;
n=read();m=read();Q=read();
for(int i=;i<=Q;++i)
{
int x=read(),y=read();
ins(x,y+n);ins(x,y+n+m);ins(x,y+n+m+m);
}
for(int i=;i<=m;++i) ins(i+n,i+n+m);
for(int i=;i<=n+*m;++i)
if(!match[i]) Solve(i);
int ans=;
for(int i=;i<=n+*m;++i) if(match[i]) ++ans;
printf("%d\n",(ans>>)-n);
}
return ;
}
[bzoj4405][wc2016]挑战NPC的更多相关文章
- [WC2016]挑战NPC(一般图最大匹配)
[WC2016]挑战NPC(一般图最大匹配) Luogu 题解时间 思路十分有趣. 考虑一个筐只有不多于一个球才有1的贡献代表什么. 很明显等效于有至少两个位置没有被匹配时有1的贡献. 进而可以构造如 ...
- [BZOJ]4405: [wc2016]挑战NPC(带花树)
带花树模板 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...
- BZOJ 4405 [wc2016]挑战NPC 带花树 一般图最大匹配
https://www.lydsy.com/JudgeOnline/problem.php?id=4405 这道题大概就是考场上想不出来,想出来也调不出来的题. 把每个桶拆成三个互相有边的点,每个球向 ...
- [WC2016]挑战NPC
Sol 这做法我是想不到\(TAT\) 每个筐子拆成三个相互连边 球向三个筐子连边 然后跑一般图最大匹配 这三个筐子间最多有一个匹配 那么显然每个球一定会放在一个筐子里,一定有一个匹配 如果筐子间有匹 ...
- [UOJ171][WC2016]挑战NPC
uoj luogu bzoj sol 你可以列一个表格. 一个框子里放球的数量 0 1 2 3 对"半空框子"数量的贡献 1 1 0 0 把一个框子拆三个点.两两之间连边. 会发现 ...
- bzoj 4405: [wc2016]挑战NPC【带花树】
把每个筐子拆成3个,分别表示放0/1/2个,然后把这三个点两两连起来,每一个可以放在筐里的球都想这三个点连边. 这样可以发现,放0个球的时候,匹配数为1,放1个球的时候,匹配数为1,放2个球的时候,匹 ...
- 【BZOJ4405】【WC2016】挑战NPC(带花树)
[BZOJ4405][WC2016]挑战NPC(带花树) 题面 BZOJ 洛谷 Uoj Description 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有n个 ...
- 「WC2016」挑战NPC
「WC2016」挑战NPC 解题思路 这个题建图非常厉害,带花树什么的只会口胡根本写不动,所以我写了机房某大佬教我的乱搞. 考虑把一个筐 \(x\) 拆成 \(x1,x2,x3\) 三个点,且这三个点 ...
- UOJ171 【WC2016】挑战NPC
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
随机推荐
- [知识梳理]课本1&2.1-2.5
面向对象的语言 出发点:更直接地描述客观世界中存在的事物(对象)以及它们之间的关系. 特点: 是高级语言. 将客观事物看作具有属性和行为的对象. 通过抽象找出同一类对象的共同属性和行为,形成类. 通过 ...
- EasyUI 修改 Messager 消息框大小
需求是要修改确认消息窗口的大小. 简单的调用方法是这样的: $.messager.confirm('操作确认', '确定批量编辑文章?', function (r) { ... } 这个时候生成的弹窗 ...
- Python内置函数(22)——list
英文文档: class list([iterable]) Rather than being a function, list is actually a mutable sequence type, ...
- SpringCloud的Hystrix(二) 某消费者应用(如:ui、网关)访问的多个微服务的断路监控
一.验证断路保护监控是否管理多个消费者 app 1.第1个消费者应用:访问自己封装rest服务 saleProd 2.第2个消费者应用:第二个应用没有反应 说明 1.每个应用实例的断路保护机制,只对本 ...
- python入门(9)字符串和编码
python入门(9)字符串和编码 字符串是一种数据类型,比较特殊的是字符串有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理. 最早的计算机在设计时采用8个比 ...
- Spring Security 入门(3-11)Spring Security 的登录密码验证过程 UsernamePasswordAuthenticationFilter
认证过程如下 一.先判断请求(请求必须是post请求)地址是否为配置的 login-processing-url 值(默认/j_spring_security_check),如果不是,则放行,进入下一 ...
- Spark-1.X编译构建及配置安装
前提条件(环境要求) jdk版本:1.7+ scala版本:1.10.4+ maven版本:3.3.3+ 本博客中使用的软件版本 spark版本:spark-1.6.1.tar.gz(源码) jdk版 ...
- SQL语句 (一)
1 SQL语句分类: 数据查询语句(DQL): SELECT 数据操纵语言 (DML): INSERT.UPDATE.DELETE 数据定义语言 (DDL): 数据控制语言 (DCL): GRANT. ...
- C# Execl表格文件转xml文件
在我们的工作中可能会需要到让execl表格转换成xml文件来使用,这样程序读取数据来也比较方便 下面就写一个小程序来实现execl表格转换成xml文件来使用 会使用到的知识点如下 1:引用第三方Exe ...
- Java进阶篇(二)——抽象类、内部类
之前在类和对象中我们说到了类的普通特性,本篇将介绍类的一些高级特性. 一.抽象类 抽象类:抽象类是只声明方法的存在而不去具体实现它的类.抽象类不能被实例化,也就是不能创建其对象.使用abstract关 ...