题目链接:ヾ(≧∇≦*)ゝ

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:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<ctype.h>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define N 2001
  7. #define inf 1926081700
  8. using namespace std;
  9. int n,m,cnt=1,S,T,head[N*3],dep[N*3];
  10. int fst[N],num[N],vis[N];
  11. struct Edge{int nxt,to,val;}edge[N*3];
  12. void ins(int x,int y,int z){
  13. edge[++cnt].nxt=head[x];
  14. edge[cnt].to=y;edge[cnt].val=z;
  15. head[x]=cnt;
  16. }
  17. namespace Network_Flow{
  18. queue<int> q;
  19. int bfs(){
  20. memset(dep,0,sizeof(dep));
  21. q.push(S);dep[S]=1;
  22. while(!q.empty()){
  23. int x=q.front();q.pop();
  24. for(int i=head[x];i;i=edge[i].nxt)
  25. if(edge[i].val&&!dep[edge[i].to]){
  26. dep[edge[i].to]=dep[x]+1;
  27. q.push(edge[i].to);
  28. }
  29. }
  30. if(dep[T]) return 1;
  31. return 0;
  32. }
  33. int dfs(int x,int rest){
  34. if(rest<=0||x==T) return rest;
  35. int flow=0;
  36. for(int i=head[x];i;i=edge[i].nxt){
  37. int y=edge[i].to,v=edge[i].val;
  38. if(dep[y]==dep[x]+1&&v){
  39. int now=dfs(y,min(rest,v));
  40. edge[i].val-=now;
  41. edge[i^1].val+=now;
  42. flow+=now;rest-=now;
  43. if(rest<=0) break;
  44. }
  45. }
  46. return flow;
  47. }
  48. int dinic(){
  49. int maxflow=0;
  50. while(bfs()) maxflow+=dfs(S,inf);
  51. return maxflow;
  52. }
  53. }
  54. int read(){
  55. int x=0,f=1;char ch=getchar();
  56. while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
  57. while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
  58. return x*f;
  59. }
  60. int main(){
  61. n=read(),m=read();
  62. S=1,T=n+m+2;
  63. using namespace Network_Flow;
  64. for(int i=1;i<=n;i++){
  65. int x=read();
  66. ins(S,i+1,x);
  67. ins(i+1,S,0);
  68. }
  69. for(int i=1;i<=m;i++){
  70. int x=read(),tot=0;
  71. memset(vis,0,sizeof(vis));
  72. for(int j=1;j<=x;j++){
  73. int y=read();
  74. if(!fst[y]){
  75. num[++tot]=y+1;
  76. fst[y]=i+n+1;
  77. }else {
  78. if(vis[fst[y]]) continue;
  79. num[++tot]=fst[y];
  80. vis[fst[y]]=1;
  81. }
  82. }
  83. x=read();
  84. ins(i+n+1,T,x);ins(T,i+n+1,0);
  85. for(int j=1;j<=tot;j++){
  86. ins(num[j],i+n+1,inf);
  87. ins(i+n+1,num[j],0);
  88. }
  89. }
  90. printf("%d\n",dinic());
  91. return 0;
  92. }

Pku1149 PIGS 卖猪的更多相关文章

  1. 【BZOJ1280】Emmy卖猪pigs 最大流

    [BZOJ1280]Emmy卖猪pigs Description Emmy在一个养猪场工作.这个养猪场有M个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位顾客都会有一些猪 ...

  2. BZOJ1280: Emmy卖猪pigs

    BZOJ1280: Emmy卖猪pigs https://lydsy.com/JudgeOnline/problem.php?id=1280 分析: 这题感觉还好,因为是有时间顺序,所以拆点做最大流即 ...

  3. [BZOJ1280][POJ1149]Emmy卖猪pigs

    [BZOJ1280][POJ1149]Emmy卖猪pigs 试题描述 Emmy在一个养猪场工作.这个养猪场有 \(M\) 个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位 ...

  4. Bzoj 1280: Emmy卖猪pigs

    1280: Emmy卖猪pigs Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 279  Solved: 182[Submit][Status][Dis ...

  5. BZOJ1280 Emmy卖猪pigs 网络流

    正解:网络流 解题报告: 传送门! 我网络流的基础题都还麻油做完就来做这个了,,,wsl,,, 首先想下最基础的构图方法 不难想到把猪圈和顾客分别当做节点,然后新建一个源点和汇点 然后考虑怎么连边,首 ...

  6. [bzoj1280]卖猪

    首先考虑猪无法流动,那么源点向每一个猪圈连猪圈中猪个数的边,每一个顾客向汇点连所需猪的边,每一个猪圈向能打开它的顾客连inf的边,跑最大流即可. 但考虑猪要流动,有一个十分巧妙地做法,将每一个顾客所有 ...

  7. POJ1149 PIGS [最大流 建图]

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20662   Accepted: 9435 Description ...

  8. poj 1149 PIGS【最大流经典建图】

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18727   Accepted: 8508 Description ...

  9. POJ 1149 PIGS 【网络流】

    题意: m n   //有m个猪圈,n个人卖猪. a1...am    //编号为i的猪圈里有ai头猪. b1 c1...cb1 d1   //第i个人有bi把钥匙,分别是ci猪圈的,其它猪圈里的猪都 ...

随机推荐

  1. GitLab篇之备份还原

    1. GitLab备份配置 输入以下命令,打开gitlab配置文件 [root@code-server ~]# vim /etc/gitlab/gitlab.rb 修改以下配置,gitlab有自动清理 ...

  2. 行为事件(ActionChains)源码详解

    ActionChains简介 actionchains是selenium里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互. 这对于做更复杂的动作非常有用,比如悬停 ...

  3. Java 集合基础知识 List/Set/Map

    一.List Set 区别 List 有序,可重复: Set 无序,不重复: 二.List Set 实现类间区别及原理 Arraylist 底层实现使用Object[],数组查询效率高 扩容机制    ...

  4. Java字符串分割

    java中字符串的分割函数,split("你想要分割的字符", 你想要最多分割为多少段,正整数) 注意事项: 1.分割特殊字符考虑转义字符的使用.如: . \ | 2.第二个参数: ...

  5. #1490 : Tree Restoration-(微软2017在线笔试)

    输入n m km个数,表示每层的节点个数接下来m行是每层的节点,节点顺序是从左往右的k个叶子节点k*k个矩阵,表示叶子节点之间的距离 输出:每个节点的父亲节点编号,root节点是0 题解:1.很明显, ...

  6. idea最常使用的快捷键

    撤销 反撤销 : Ctrl+Z / Ctrl+Shift+Z 删除一行 : Ctrl+Y 跳到实现类 : Ctrl+Alt+B 重命名文件:   shift+F6 控制台放大缩小: ctrl+shif ...

  7. BugPhobia开发篇章:Scurm Meeting-更新至0x02

    0x01 :目录与摘要 If you weeped for the missing sunset, you would miss all the shining stars 索引 提纲 整理与更新记录 ...

  8. Task 6.2冲刺会议九 /2015-5-22

    今天把之前的跳转问题加以改正并加以优化.遇到的主要问题是跳转的时后时间有点长,以为没有成功.之后查资料说是端口没有及时释放,导致了程序的滞缓.明天要继续把程序的界面进行优化.

  9. P4: Programming Protocol-Independent Packet Processors

    P4: Programming Protocol-Independent Packet Processors 摘要 P4是一门高级语言,用于编程与协议无关的数据包处理器.P4与SDN控制协议相关联,类 ...

  10. 我的寒假C(C++)学习计划

    前言 要补缺加强C语言的想法由来已久,上学期因为种种原因,某些知识点学习得不是很理想,而且,许多地方也有加强的必要,所以这次布置的随笔可谓是来得恰到好处. 学习材料 C Primer Plus 师爷的 ...