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 & ...
随机推荐
- IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET
感谢大佬:https://www.cnblogs.com/sixindev/p/4723590.html 下面这些内容不了解也可以进行开发,深入了解一下还是收益良多 区别 TCP.UDP.HTTP.S ...
- vagrant的box哪里下?镜像在哪儿找?教你在vagrant官网下载各种最新.box资源
原文:vagrant的box哪里下?镜像在哪儿找?教你在vagrant官网下载各种最新.box资源 一.进入vagrant官网 https://www.vagrantup.com/ 二.点击findb ...
- 自定义的类实现copy操作
1.自定义类实现copy操作 让类遵守NSCopying协议 实现 copyWithZone:方法,在该方法中返回一个对象的副本即可. 在copyWithZone方法中,创建一个新的对象,并设置该对象 ...
- 《PHP程序员面试笔试宝典》——如何回答技术性的问题?
如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 程序员面试中,面试官会经常询问一些技术性的问题,有的问题可能比较简单,都是历年的面试.笔试真题,求职者在平时的复习中会经 ...
- Solution -「ARC 124E」Pass to Next
\(\mathcal{Description}\) Link. 有 \(n\) 个人站成一个环,初始时第 \(i\) 个人手里有 \(a_i\) 个球.第 \(i\) 个人可以将自己手中任意数 ...
- traceroute实用命令总结
在工作中,我们经常会使用到traceroute进行追踪路由,从而判断网络的故障点,或者网络策略限制等原因.对于网络排查traceroute还是有很大用处的. 一.traceroute常用命令参数 用法 ...
- python的import语句
1.import作用 import跟C/C++中的#include作用有点类似,都是为了调用定义在其他文件中的变量.函数或者类,但实现的区别很大. C/C++中如果a.cpp include了b.h那 ...
- LinuxCPU性能工具总结
一.根据性能指标找工具 二.根据工具查性能指标
- C# 实例解释面向对象编程中的里氏替换原则
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...
- spring循环依赖的产生与解决
1.循环依赖的产生 在spring中对象默认都是单例的 ,意味整个容器中只有一个该类的对象. 如图,B类有一个属性a,A类有一个属性b.当B类创建对象时,要给a属性赋值:当A类创建对象时,要给b属性赋 ...