https://www.lydsy.com/JudgeOnline/problem.php?id=4405

这道题大概就是考场上想不出来,想出来也调不出来的题。

把每个桶拆成三个互相有边的点,每个球向它连接的桶的三个点分别连边。

0球1桶,匹配数为1;1球1桶,匹配数为2;2球一桶,匹配数为2;3球一桶,匹配数为3;

发现每种半桶的情况下匹配数都比该桶中放的球数大1,那么ans=最大匹配数-球数。

带花树找lca的时候,记得是用每个点的总父亲找。带花树的细节真是恶心人。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
#define LL long long
const int maxn=;
const int maxm=;
int n,m,siz;
struct nod{
int y,next;
}e[maxn];int head[maxm]={},tot=;
int q[maxn]={},tl,tr;
int bel[maxm]={},tly,d[maxm]={},pre[maxm]={},tp[maxm]={},fa[maxm]={};
inline void init(int x,int y){e[++tot].y=y;e[tot].next=head[x];head[x]=tot;}
inline int getfa(int x){
return fa[x]==x?x:fa[x]=getfa(fa[x]);
}
inline int lca(int x,int y){
++tly;
for(;;){
if(x){
x=getfa(x);
if(bel[x]==tly)return x;
else{bel[x]=tly;x=pre[d[x]];}
}swap(x,y);
}
}
inline void mlink(int x,int y,int pa){
while(getfa(x)!=pa){
pre[x]=y;y=d[x];
if(tp[y]==){tp[y]=;q[++tr]=y;}
if(getfa(x)==x)fa[x]=pa;
if(getfa(y)==y)fa[y]=pa;
x=pre[y];
}
}
int doit(int s){
for(int i=;i<=siz;++i)fa[i]=i;
memset(tp,,sizeof(tp));memset(pre,,sizeof(pre));
tl=tr=;q[]=s;tp[s]=;
while(tl<=tr){
int x=q[tl];++tl;
for(int i=head[x];i;i=e[i].next){
int y=e[i].y;
if(getfa(y)==getfa(x)||tp[y]==)continue;//cout<<i<<endl;
if(!tp[y]){
tp[y]=;pre[y]=x;//cout<<y<<endl;
if(!d[y]){
for(int now=y,j,las;now;now=las){
j=pre[now];las=d[pre[now]];
d[j]=now;d[now]=j;
}//cout<<i<<1<<endl;
return ;
}
tp[d[y]]=;q[++tr]=d[y];
}
else{
int pa=lca(x,y);
mlink(x,y,pa);mlink(y,x,pa);
}
}
}
return ;
}
int main(){
int T;scanf("%d",&T);
while(T-->){
memset(bel,,sizeof(bel));memset(d,,sizeof(d));
memset(head,,sizeof(head));
tot=tly=;
int p;
scanf("%d%d%d",&n,&m,&p);siz=n+m*;
int x,y;
for(int i=;i<=m;++i){
init(i,i+m);init(i+m,i);
init(i,i+m*);init(i+m*,i);
init(i+m,i+m*);init(i+m*,i+m);
}
for(int i=;i<=p;++i){
scanf("%d%d",&x,&y);
init(m*+x,y);init(y,m*+x);
init(m*+x,y+m);init(y+m,m*+x);
init(m*+x,y+m*);init(y+m*,m*+x);
}
int ans=;
for(int i=;i<=siz;++i)if(!d[i])ans+=doit(i);
printf("%d\n",ans-n);
}
return ;
}

BZOJ 4405 [wc2016]挑战NPC 带花树 一般图最大匹配的更多相关文章

  1. [BZOJ]4405: [wc2016]挑战NPC(带花树)

    带花树模板 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...

  2. bzoj 4405: [wc2016]挑战NPC【带花树】

    把每个筐子拆成3个,分别表示放0/1/2个,然后把这三个点两两连起来,每一个可以放在筐里的球都想这三个点连边. 这样可以发现,放0个球的时候,匹配数为1,放1个球的时候,匹配数为1,放2个球的时候,匹 ...

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

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

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

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

  5. [bzoj4405][wc2016]挑战NPC

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有n个球,用整数1到n编号.还有m个筐子,用整数1到m编号. ...

  6. [WC2016]挑战NPC

    Sol 这做法我是想不到\(TAT\) 每个筐子拆成三个相互连边 球向三个筐子连边 然后跑一般图最大匹配 这三个筐子间最多有一个匹配 那么显然每个球一定会放在一个筐子里,一定有一个匹配 如果筐子间有匹 ...

  7. [UOJ171][WC2016]挑战NPC

    uoj luogu bzoj sol 你可以列一个表格. 一个框子里放球的数量 0 1 2 3 对"半空框子"数量的贡献 1 1 0 0 把一个框子拆三个点.两两之间连边. 会发现 ...

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

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

  9. 【BZOJ4405】【WC2016】挑战NPC(带花树)

    [BZOJ4405][WC2016]挑战NPC(带花树) 题面 BZOJ 洛谷 Uoj Description 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有n个 ...

随机推荐

  1. ubuntu 用 apt get 安装某个包的某个版本

    1.首先用如下命令查询你的机器安装了哪些版本: dpkg -l 'apache2*' 2.然后用如下命令查询远程库存在哪些版本: apt-cache madison "libqt5gui5& ...

  2. 没有备份怎么恢复被drop的表(利用undrop-for-innodb)

    介绍:     也许大家都难以理解,这么重要的数据为啥不备份(或者备份不可用)?而且还任性的drop table了.显然有备份是最好的,但是它们并不总是可用的.这种情况令人恐惧,但并非毫无希望.在许多 ...

  3. centos下常用文件管理命令

    fdisk     d 删除分区     n:新建一个分区     p:列出已有分区     t:调整分区ID     l:列出内核支持的分区id     w:保存退出     q:不保存退出    ...

  4. Centos6安装FreeSWITCH 1.5时./configure问题解决记录

    系统:Centos 6.4 64位: FreeSWITCH版本:1.5 具体的安装过程参考FreeSWITCH 官网wiki (也可以参考我的博客<Centos6安装FreeSWITCH> ...

  5. bootgrid 刷新保持当前排序

    1. 前言 主要是利用了HTHNL5的localStorage技术和用ajax传输一个数组到后台并进行判断.这篇文章是解决一个小需求而来的,主要是用来记录. 2. 代码 JavaScript: var ...

  6. Fiddler抓包9-保存会话(save)

    前言 为什么要保存会话呢?举个很简单的场景,你在上海测试某个功能接口的时候,发现了一个BUG,而开发这个接口的开发人员是北京的一家合作公司.你这时候给对方开发提bug, 如何显得专业一点,能让对方心服 ...

  7. python 全栈开发,Day35(TCP协议 粘包现象 和解决方案)

    一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...

  8. 步步为营-36-ADO.Net简介

    与数据库进行连接交互 方法一 #region 01连接对象 //01 连接字符串 string connstr = "server=.;uid=sa;pwd=sa;database=Demo ...

  9. HDU1711 Number Sequence(KMP模板题)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. 51nod1185 威佐夫游戏 V2 (模拟乘法)

    1185 威佐夫游戏 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取 ...