Pku1149 PIGS 卖猪
题目链接:ヾ(≧∇≦*)ゝ
Description
Emmy在一个养猪场工作。这个养猪场有M个锁着的猪圈,但Emmy并没有钥匙。
顾客会到养猪场来买猪,一个接着一个。每一位顾客都会有一些猪圈的钥匙,他们会将这些猪圈打开并买走固定数目的猪。所有顾客有的钥匙和他们需要买猪的数量在事先都告诉了Emmy,于是Emmy要订一个计划,使得卖出去的猪最多。
买卖的过程是这样的:一个顾客前来,并打开所有他可以打开的猪圈。然后Emmy从这些猪圈里牵出固定数目的猪卖给顾客(最多只能和顾客需要数相等),并可以重新安排这些开着的猪圈中的猪。
每个猪圈可以存放任意数目的猪。
写一个程序,使得Emmy能够卖出去尽可能多的猪。
Input
第一行有两个整数:M和N,表示猪圈数和顾客数。
第二行有M个整数,表示每个猪圈初始时有多少猪。
接下来的N行按照前来的次序描述了每一个顾客,每行的格式如下:
A K1 K2…KA B
A表示该顾客拥有的钥匙数,K1...KA表示每个钥匙所对应的猪圈,B表示该顾
客需要购买的猪的数目。
1 ≤ M ≤ 1000
1 ≤ N ≤ 100
Output
仅包含一个整数,即最多能卖出去的猪的数目。
Sample Input
3 3
3 1 10
2 1 2 2
2 1 3 3
1 2 6
Sample Output
7
Solution:
如何构建网络图呢?
我们知道每次一个顾客来买完猪后,我们都可以通过调整猪圈里猪的数量来得到最优解,如何实现调整这个步骤?
我们可以把第一个拥有x猪圈的钥匙的人看做一个中转站,与x猪圈连边,对于之后的每个拥有x猪圈钥匙的人都与这个人连边,边的容量都为inf,就能实现调整猪的行动了
显然的是,要先把每个猪圈与源点连边,容量为猪圈内一开始的猪的数量,再把每个顾客与汇点连边,容量为顾客的需求
完成建图之后,再跑一遍最大流就行了
Code:
#include<queue>
#include<cstdio>
#include<ctype.h>
#include<cstring>
#include<algorithm>
#define N 2001
#define inf 1926081700
using namespace std;
int n,m,cnt=1,S,T,head[N*3],dep[N*3];
int fst[N],num[N],vis[N];
struct Edge{int nxt,to,val;}edge[N*3];
void ins(int x,int y,int z){
edge[++cnt].nxt=head[x];
edge[cnt].to=y;edge[cnt].val=z;
head[x]=cnt;
}
namespace Network_Flow{
queue<int> q;
int bfs(){
memset(dep,0,sizeof(dep));
q.push(S);dep[S]=1;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=edge[i].nxt)
if(edge[i].val&&!dep[edge[i].to]){
dep[edge[i].to]=dep[x]+1;
q.push(edge[i].to);
}
}
if(dep[T]) return 1;
return 0;
}
int dfs(int x,int rest){
if(rest<=0||x==T) return rest;
int flow=0;
for(int i=head[x];i;i=edge[i].nxt){
int y=edge[i].to,v=edge[i].val;
if(dep[y]==dep[x]+1&&v){
int now=dfs(y,min(rest,v));
edge[i].val-=now;
edge[i^1].val+=now;
flow+=now;rest-=now;
if(rest<=0) break;
}
}
return flow;
}
int dinic(){
int maxflow=0;
while(bfs()) maxflow+=dfs(S,inf);
return maxflow;
}
}
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main(){
n=read(),m=read();
S=1,T=n+m+2;
using namespace Network_Flow;
for(int i=1;i<=n;i++){
int x=read();
ins(S,i+1,x);
ins(i+1,S,0);
}
for(int i=1;i<=m;i++){
int x=read(),tot=0;
memset(vis,0,sizeof(vis));
for(int j=1;j<=x;j++){
int y=read();
if(!fst[y]){
num[++tot]=y+1;
fst[y]=i+n+1;
}else {
if(vis[fst[y]]) continue;
num[++tot]=fst[y];
vis[fst[y]]=1;
}
}
x=read();
ins(i+n+1,T,x);ins(T,i+n+1,0);
for(int j=1;j<=tot;j++){
ins(num[j],i+n+1,inf);
ins(i+n+1,num[j],0);
}
}
printf("%d\n",dinic());
return 0;
}
Pku1149 PIGS 卖猪的更多相关文章
- 【BZOJ1280】Emmy卖猪pigs 最大流
[BZOJ1280]Emmy卖猪pigs Description Emmy在一个养猪场工作.这个养猪场有M个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位顾客都会有一些猪 ...
- BZOJ1280: Emmy卖猪pigs
BZOJ1280: Emmy卖猪pigs https://lydsy.com/JudgeOnline/problem.php?id=1280 分析: 这题感觉还好,因为是有时间顺序,所以拆点做最大流即 ...
- [BZOJ1280][POJ1149]Emmy卖猪pigs
[BZOJ1280][POJ1149]Emmy卖猪pigs 试题描述 Emmy在一个养猪场工作.这个养猪场有 \(M\) 个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位 ...
- Bzoj 1280: Emmy卖猪pigs
1280: Emmy卖猪pigs Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 279 Solved: 182[Submit][Status][Dis ...
- BZOJ1280 Emmy卖猪pigs 网络流
正解:网络流 解题报告: 传送门! 我网络流的基础题都还麻油做完就来做这个了,,,wsl,,, 首先想下最基础的构图方法 不难想到把猪圈和顾客分别当做节点,然后新建一个源点和汇点 然后考虑怎么连边,首 ...
- [bzoj1280]卖猪
首先考虑猪无法流动,那么源点向每一个猪圈连猪圈中猪个数的边,每一个顾客向汇点连所需猪的边,每一个猪圈向能打开它的顾客连inf的边,跑最大流即可. 但考虑猪要流动,有一个十分巧妙地做法,将每一个顾客所有 ...
- POJ1149 PIGS [最大流 建图]
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20662 Accepted: 9435 Description ...
- poj 1149 PIGS【最大流经典建图】
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18727 Accepted: 8508 Description ...
- POJ 1149 PIGS 【网络流】
题意: m n //有m个猪圈,n个人卖猪. a1...am //编号为i的猪圈里有ai头猪. b1 c1...cb1 d1 //第i个人有bi把钥匙,分别是ci猪圈的,其它猪圈里的猪都 ...
随机推荐
- Qt 利用XML文档,写一个程序集合 四
接上一篇https://www.cnblogs.com/DreamDog/p/9214067.html 启动外部程序 这里简单了,直接上代码吧 connect(button,&MPushBut ...
- oracle数据库数据字典应用
oracle数据字典 数据字典是由oracle服务器创建和维护的一组只读的系统表.数据字典分为两类:一是基表,二是数据字典视图. 数据字典视图包括用户名.用户权限.对象名.约束和审计等信息,是通过运行 ...
- bootstrap switch样式修改与多列等间距布局
先以一张图开启今天的随笔 今天实习遇到了switch按钮,小姐姐说用插件bootstrap switch来写,我第一次用这个插件,首先在引入方面就遇到了很多坑,先来总结一下bootstrap swit ...
- Netty源码分析第6章(解码器)---->第4节: 分隔符解码器
Netty源码分析第六章: 解码器 第四节: 分隔符解码器 基于分隔符解码器DelimiterBasedFrameDecoder, 是按照指定分隔符进行解码的解码器, 通过分隔符, 可以将二进制流拆分 ...
- 可道云kodexplorer搭建私有云后的配置优化
一.上传下载速度优化首先明确可道云没有对上传下载做任何限制,速度快慢和网络环境有关.可道云是基于http上传,所以和其他http上传速度基本一致:可以对比其他web系统或网站说附件上传速度.同其他例如 ...
- Streamr助你掌控自己的数据(3)——教你在Streamr市场上发布数据
博客说明 所有刊发内容均可转载但是需要注明出处. 教你在Streamr市场上发布数据 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至 ...
- 基于C#的机器学习--贝叶斯定理-执行数据分析解决肇事逃逸之谜
贝叶斯定理-执行数据分析解决肇事逃逸之谜 在这一章中,我们将: 应用著名的贝叶斯定理来解决计算机科学中的一个非常著名的问题. 向您展示如何使用贝叶斯定理和朴素贝叶斯来绘制数据,从真值表中发现异常值 ...
- maven摘除jar包中配置文件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-p ...
- [linux] 利用PROMPT_COMMAND实现命令审计
网上查了实现命令审计大概有以下几种: 查不到了,改天再补充 以下环境基于CentOS 6 1.修改history时间格式 echo 'HISTTIMEFORMAT="%F %T " ...
- web05-CounterServlet
电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...