LGP2891题解
题目大意
有 \(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题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 用maven在MANIFEST.MF文件中的Class-Path中增加当前目录(.)
Xml代码 <configuration> <archive> <manifest> <mainClass>com.dongwei.test.Main& ...
- selenium学习路线
1.配置你的测试环境,针对你所学习语言,来配置你相应的selenium 测试环境.selenium 好比定义的语义---"问好",假如你使用的是中文,为了表术问好,你的写法是& ...
- HTML笔记整理--上节
一.认识WEB 「网页」主要是由文字.图像和超链接等元素构成,当然除了这些元素,网页中还可以包括音频.视频以及Flash等. 「浏览器」是网页显示.运行的平台. 「浏览器内核」(排版引擎.解释引擎.渲 ...
- Kubernetes:容器资源需求与限制(约束)
Blog:博客园 个人 A Container is guaranteed to have as much memory as it requests, but is not allowed to u ...
- 个人觉得好用的Idea插件
Intellij IDEA插件 排名不分先后 1. Codota 代码智能提示插件 只要打出首字母就能联想出一整条语句,这也太智能了,还显示了每条语句使用频率.原因是它学习了我的项目代码,总结出了我的 ...
- JVM学习——内存空间(学习过程)
JVM--内存空间 关于内存的内容,内存的划分.JVM1.7 -> 1.8的变化比较大 JVM指令执行的时候,是基于栈的操作.每一个方法执行的时候,都会有一个属于自己的栈帧的数据结构.栈的深度, ...
- Python中模块import的使用案例
1 import test # 导入test模块 2 3 print(test.a) # 使用"模块.变量"调用模块中的变量 4 5 test.hi() # 使用"模块. ...
- 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选
Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ...
- [数分笔记]Dedekind切割定理的证明
1.定理内容 Dedekind切割定理:设是实数集的一个切割,则或者有最大数,或者有最小数. 2.证明过程 设是中所有有理数所构成的集合,是中所有有理数所构成的集合 从而构成一个有理数集的切割 有三种 ...
- 学习OMO游戏管理驾驶舱的设计
2019年第1季度,Smartbi帮助合作伙伴开发了一个销售管理沙盘游戏(OMO),在第一个版本中主要精力放在游戏的后台过程逻辑上(基于电子表格的报表和回写能力),并没有把Smartbi的最强项--数 ...