[BZOJ]4405: [wc2016]挑战NPC(带花树)
带花树模板
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=x*+c-'';
return x;
}
#define MN 600
#define ME 100000
#define ms(a) memset(a,0,sizeof(a))
struct edge{int nx,t;}e[ME*+];
int h[MN+],en,mat[MN+],nx[MN+],mk[MN+],f[MN+],q[MN+],qn,u[MN+],cnt;
inline void ins(int x,int y)
{
e[++en]=(edge){h[x],y};h[x]=en;
e[++en]=(edge){h[y],x};h[y]=en;
}
int gf(int k){return f[k]?f[k]=gf(f[k]):k;}
int lca(int x,int y)
{
for(++cnt;;swap(x,y))if(x)
{
x=gf(x);
if(u[x]==cnt)return x;
u[x]=cnt;
x=nx[mat[x]];
}
}
void group(int x,int r)
{
while(x!=r)
{
int a=mat[x],b=nx[a];
if(gf(b)!=r)nx[b]=a;
if(mk[a]>)mk[q[++qn]=a]=;
if(mk[b]>)mk[q[++qn]=b]=;
if(gf(x)!=gf(a))f[gf(x)]=gf(a);
if(gf(a)!=gf(b))f[gf(a)]=gf(b);
x=b;
}
}
bool aug(int x)
{
int i,j,y,r;
ms(nx);ms(mk);ms(f);
for(mk[q[i=qn=]=x]=;i<=qn;++i)for(j=h[x=q[i]];j;j=e[j].nx)
{
y=e[j].t;
if(mat[x]==y||gf(x)==gf(y)||mk[y]>)continue;
if(mk[y])
{
r=lca(x,y);
if(gf(x)!=r)nx[x]=y;
if(gf(y)!=r)nx[y]=x;
group(x,r);group(y,r);
}
else if(!mat[y])
{
for(nx[y]=x,i=y;i;i=y)
{
x=nx[i];y=mat[x];
mat[i]=x;mat[x]=i;
}
return true;
}
else
{
nx[y]=x;mk[y]=;
mk[q[++qn]=mat[y]]=;
}
}
return false;
}
int main()
{
int T=read(),n,m,e,x,y;
while(T--)
{
n=read();m=read();e=read();
ms(h);en=;ms(mat);
for(x=;x<=m;++x)ins(n+(x-)*+,n+(x-)*+);
while(e--)
{
x=read();y=read();
ins(x,n+(y-)*+);
ins(x,n+(y-)*+);
ins(x,n+(y-)*+);
}
for(x=,y=-n;x<=n+*m;++x)if(!mat[x]&&aug(x))++y;
printf("%d\n",y);
}
}
[BZOJ]4405: [wc2016]挑战NPC(带花树)的更多相关文章
- BZOJ 4405 [wc2016]挑战NPC 带花树 一般图最大匹配
https://www.lydsy.com/JudgeOnline/problem.php?id=4405 这道题大概就是考场上想不出来,想出来也调不出来的题. 把每个桶拆成三个互相有边的点,每个球向 ...
- bzoj 4405: [wc2016]挑战NPC【带花树】
把每个筐子拆成3个,分别表示放0/1/2个,然后把这三个点两两连起来,每一个可以放在筐里的球都想这三个点连边. 这样可以发现,放0个球的时候,匹配数为1,放1个球的时候,匹配数为1,放2个球的时候,匹 ...
- [WC2016]挑战NPC(一般图最大匹配)
[WC2016]挑战NPC(一般图最大匹配) Luogu 题解时间 思路十分有趣. 考虑一个筐只有不多于一个球才有1的贡献代表什么. 很明显等效于有至少两个位置没有被匹配时有1的贡献. 进而可以构造如 ...
- [bzoj4405][wc2016]挑战NPC
来自FallDream的博客,未经允许,请勿转载,谢谢. 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有n个球,用整数1到n编号.还有m个筐子,用整数1到m编号. ...
- [WC2016]挑战NPC
Sol 这做法我是想不到\(TAT\) 每个筐子拆成三个相互连边 球向三个筐子连边 然后跑一般图最大匹配 这三个筐子间最多有一个匹配 那么显然每个球一定会放在一个筐子里,一定有一个匹配 如果筐子间有匹 ...
- [UOJ171][WC2016]挑战NPC
uoj luogu bzoj sol 你可以列一个表格. 一个框子里放球的数量 0 1 2 3 对"半空框子"数量的贡献 1 1 0 0 把一个框子拆三个点.两两之间连边. 会发现 ...
- 【BZOJ4405】【WC2016】挑战NPC(带花树)
[BZOJ4405][WC2016]挑战NPC(带花树) 题面 BZOJ 洛谷 Uoj Description 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有n个 ...
- P4258-[WC2016]挑战NPC【带花树】
正题 题目链接:https://www.luogu.com.cn/problem/P4258 题目大意 给出\(n\)个球,\(m\)个篮筐,每个球都可以被放入一些特定的篮筐,每个球都要放,要求球的个 ...
- 「WC2016」挑战NPC
「WC2016」挑战NPC 解题思路 这个题建图非常厉害,带花树什么的只会口胡根本写不动,所以我写了机房某大佬教我的乱搞. 考虑把一个筐 \(x\) 拆成 \(x1,x2,x3\) 三个点,且这三个点 ...
随机推荐
- 需求分析&原型改进
需求&原型改进 一.给目标用户展现原型,与目标用户进一步沟通理解需求. 1.用户痛点:需要随时随地练习四则运算,并能看到用户的统计数据. 2.用户反馈:较好地解决练习需求,若能加入班级概念则更 ...
- Alpha冲刺第十二天
Alpha冲刺第十二天 站立式会议 项目进展 项目核心功能,如学生基本信息管理模块,学生信用信息模块,奖惩事务管理模块等等都已完成,测试工作大体结束. 问题困难 项目结束后对项目的阶段性总结缺乏一定的 ...
- 冲刺NO.1
Alpha冲刺第一天 站立式会议 项目进展 项目的第一天,主要工作是对项目的开发进行规划,以及将规划的成果转化为燃尽图与博客文章.依据项目需求分析报告与开题报告中已经完成的设计任务和项目规划,我们将系 ...
- django搭建web (三) admin.py -- 待续
demo 关于模型myQuestion,myAnswer将在后述博客提及 # -*- coding: utf-8 -*- from __future__ import unicode_literals ...
- 关于collectionView和tableView的两种cell的出列方法的区别
相信好多人一定会对collectionView和tableView的两种cell出列方法有所疑问,下面以UICollection为例子进行举例说明 假设我们已经创建了一个collectionView, ...
- 《高级软件测试》web测试实践--12月30日记录
考完数学,我们正式开始web测试实践的作业,今天,我们主要进行了方案的选择和人员的分工.任务计划和安排如上图所示. 任务进展:完成题目选择和人员分工: 遇到问题:暂无: 下一步任务:完成软件评测.用户 ...
- LoadRunner录制手机APP教程
1. 开启fiddler 2. 打开HP Virtual User Generator,新建->Web (HTTP/HTML)>创建 3. 点击开始录制: (1) ...
- JS中的 map, filter, some, every, forEach, for...in, for...of 用法总结
1.map 有返回值,返回一个新的数组,每个元素为调用func的结果. let list = [1, 2, 3, 4, 5]; let other = list.map((d, i) => { ...
- R语言基础1
----------------------------------R语言学习与科研应用,科研作图,数据统计挖掘分析,群:719954246-------------------------- 我们将 ...
- JAVA_SE基础——编码规范&代码编写规则
这次我来给大家说明下编码规范&代码编写规则 ↓ 编码规范可以帮助程序员在编程时注意一些细节问题,提高程序的可读性,让程序员能够尽快地理解新的代码,并帮助大家编写出规范的利于维护的Java代码 ...