题目大意

有 \(n\) 只奶牛,\(q\) 种食物和 \(p\) 种饮料,每只奶牛喜欢一些饮料和食物,但只能那一种,求最小配对数量。

首先来看一下这道题的简化版:没有饮料,该怎么做呢?

我会!裸的二分图最大匹配!

但加了饮料,就有了两种限制条件,我们自然地想到直接饮料、食物和奶牛都连边,用Dinic跑网络最大流。

于是你WA了。

问题处在哪儿呢?

让我们来看一组数据:

1 2 2
2 2 1 2 1 2

用Dinic跑网络最大流,答案是2,但正确答案是1。

问题在于:同一只奶牛选了两次。

所以我们运用拆点的思想,将一只奶牛拆成两个点:出点和入点,食物连入点,出点连饮料。

然后你再交上去就A了qwq

给一下代码吧:

#include<cstring>
#include<cstdio>
#include<queue>
const int M=405;
struct Edge{
int to,nx,flow;
}e[M*200];
int n,q,p,s,t,cnt=1,d[M],h[M],cur[M];
inline int min(const int a,const int b){
return a>b?b:a;
}
inline void Add(int x,int y){
e[++cnt]=(Edge){y,h[x],1};h[x]=cnt;
e[++cnt]=(Edge){x,h[y],0};h[y]=cnt;
}
inline bool BFS(){
register int E,u,v;
std::queue<int>q;
memset(d,0,sizeof d);
q.push(s);d[s]=1;
while(!q.empty()){
u=q.front();q.pop();
for(E=cur[u]=h[u];E;E=e[E].nx)if(e[E].flow){
v=e[E].to;
if(!d[v]){
d[v]=d[u]+1;
q.push(v);
}
}
}
return d[t];
}
int DFS(register int u,register int flow){
if(u==t)return flow;
int used=flow;
for(register int&E=cur[u];E;E=e[E].nx)if(e[E].flow){
int v=e[E].to;
if(d[v]==d[u]+1){
int f=DFS(v,min(used,e[E].flow));
e[E].flow-=f;e[E^1].flow+=f;used-=f;
if(!f)d[v]=0;
if(!used)return flow;
}
}
return cur[u]=h[u],flow-used;
}
inline int Dinic(){
int ans=0;
while(BFS())while(int d=DFS(s,2e9))ans+=d;
return ans;
}
signed main(){
int i,j,u,x,y;
scanf("%d%d%d",&n,&q,&p);
s=0;t=q+n+n+p+1;
for(i=1;i<=q;++i)Add(s,i);
for(i=1;i<=n;++i)Add(q+i,q+n+i);
for(i=1;i<=p;++i)Add(q+n+n+i,t);
for(i=1;i<=n;++i){
scanf("%d%d",&x,&y);
for(j=1;j<=x;++j){
scanf("%d",&u);
Add(u,q+i);
}
for(j=1;j<=y;++j){
scanf("%d",&u);
Add(q+n+i,q+n+n+u);
}
}
printf("%d",Dinic());
}

P.S.:这种题能少一点儿吗qwq,这已经是我遇到的第三道“酒店之王”了 qwq

LGP2891题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 开源项目实现多线程下载 (xutils)

    public void download(View v){         EditText et_url = (EditText) findViewById(R.id.et_url);        ...

  2. Embedded Python应用小结

    转载请注明来源:https://www.cnblogs.com/hookjc/ (1)初始化Python脚本运行环境 Py_Initialize(); (2) 脚本的编译 bytecode = Py_ ...

  3. List接口中特有方法

    import java.util.ArrayList; import java.util.List; /* List接口中特有方法: 添加 add(int index, E element) addA ...

  4. nvidia-smi

    内容转自:https://blog.csdn.net/handsome_bear/article/details/80903477 nvidia-smi 显示 说明 Fan 风扇转速(0%--100% ...

  5. 通过PEB寻找函数地址

      通过PEB的Ldr参数(结构体定义为_PEB_LDR_DATA),遍历当前进程加载的模块信息链表,找到目标模块.   摘自PEB LDR DATA: typedef struct _PEB_LDR ...

  6. php异步:在php中使用fsockopen curl实现类似异步处理的功能方法

    PHP从主流来看,是一门面向过程的语言,它的最大缺点就是无法实现多线程管理,其程序的执行都是从头到尾,按照逻辑一路执行下来,不可能出现分支,这一点是限制php在主流程序语言中往更高级的语言发展的原因之 ...

  7. 突然发现,npm里request依赖包已经弃用,怎么办?

    摘要:在npm官网查看了request依赖包的当前状态,果然在2020年就被弃用了. 本文分享自华为云社区<npm里request依赖包已经弃用?致敬并调研替代方案!>,作者: gentl ...

  8. Spring Cloud之微服务注册到Eureka Server集群后访问改造

    上篇Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼ - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)已经已经成功将两个微服务注册到集群中,那么能正常能与注 ...

  9. Spring MVC 是什么? 核心总结

    SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰 ...

  10. 关于oracle中(+)的运用

    一.基础 1.1 SQL查询的基本原理 第一.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果.第二.两表 ...