http://acm.hdu.edu.cn/showproblem.php?pid=4292

给一些人想要的食物和饮料,和你拥有的数量,问最多多少人可以同时获得一份食物和一份饮料

写的时候一共用了2种拆点建图的方法...

1.

  起点连接饮料和食物,容量为拥有的数量

  每个人被拆成三个点,$a,b,c$  $a$被想要的食物连接,$b$被想要的饮料连接,$c$被$a,b$连接,容量均为1

  然后$c$点连接汇点,容量为2,最后遍历所有静态链表节点,对于所有指向汇点的边,如果剩余容量为0,则答案++

  

  然而错了,有的点会为了更大的流量而不填满$C-T$的边...会少算很多

2.

  汇点连接食物,容量为拥有量,把每个人拆成2个点$a,b$,$a$被食物连接,$a$再连接$b$,$b$再连接饮料,容量均为1,最终饮料连接汇点容量为拥有量,

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
  4. #define pp pair<int,int>
  5. #define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
  6. #define per(ii,a,b) for(int ii=a;ii>=b;ii--)
  7. #define show(x) cout<<#x<<"="<<x<<endl
  8. #define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
  9. #define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
  10. #define showa(a,b) cout<<#a<<'['<<b<<"]="<<b[a]<<endl
  11. using namespace std;
  12. const int maxn=1e4+10;
  13. const int maxm=1e6+10;
  14. const int INF=0x3f3f3f3f;
  15. int casn,n,m,k;
  16. struct node {int to;int cap;int next;}e[maxm];
  17. int ss,tt,head[maxn],nume,dis[maxn];
  18. inline void addx(int a,int b,int c){
  19. e[++nume]=(node){b,c,head[a]};
  20. head[a]=nume;
  21. }
  22. inline void add(int a,int b,int c){
  23. addx(a,b,c);addx(b,a,0);
  24. }
  25. bool bfs(int s=ss,int t=tt){
  26. int top=0,end=1;
  27. int q[maxn];
  28. q[0]=s;
  29. // for(int i=0;i<=t;i++) dis[i]=0;
  30. memset(dis,0,sizeof dis);
  31. dis[s]=1;
  32. while(top!=end){
  33. int now=q[top++];top%=maxn;
  34. for(int i=head[now];i;i=e[i].next){
  35. int to=e[i].to;
  36. if(!dis[to]&&e[i].cap){
  37. dis[to]=dis[now]+1;
  38. if(to==t)break;
  39. q[end++]=to;end%=maxn;
  40. }
  41. }
  42. }
  43. return dis[t];
  44. }
  45. int dfs(int now=ss,int last=INF){
  46. if(now==tt)return last;
  47. int flow=0,det;
  48. for(int i=head[now];i;i=e[i].next){
  49. int to=e[i].to;
  50. if(e[i].cap&&dis[to]==dis[now]+1){
  51. det=dfs(to,min(last-flow,e[i].cap));
  52. flow+=det;
  53. e[i].cap-=det;
  54. e[i^1].cap+=det;
  55. if(flow==last) return last;
  56. }
  57. }
  58. dis[now]=-1;
  59. return flow;
  60. }
  61. int a,b,c;
  62. char ch[maxn];
  63.  
  64. int main(){
  65. //#define test
  66. #ifdef test
  67. freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
  68. #endif
  69. int d,f;
  70. while(~scanf("%d%d%d",&n,&f,&d)){
  71. memset(head,0,sizeof head);
  72. nume=1;
  73. ss=0,tt=d+f+3*n+1;
  74. rep(i,1,f) {
  75. scanf("%d ",&a);
  76. add(ss,i,a);
  77. }
  78. rep(i,1,d){
  79. scanf("%d ",&a);
  80. add(i+f+2*n,tt,a);
  81. }
  82. rep(i,1,n){
  83. scanf("%s",ch);
  84. rep(j,1,f){
  85. if(ch[j-1]=='Y') add(j,i+f,1);
  86. }
  87. }
  88. rep(i,1,n){
  89. scanf("%s",ch);
  90. rep(j,1,d){
  91. if(ch[j-1]=='Y') add(i+f+n,j+f+2*n,1);
  92. }
  93. add(i+f,i+f+n,1);
  94. }
  95. int ans=0;
  96. while(bfs()){ans+=dfs();}
  97. printf("%d\n",ans);
  98. }
  99.  
  100. #ifdef test
  101. fclose(stdin);fclose(stdout);system("out.txt");
  102. #endif
  103. return 0;
  104. }

Food HDU - 4292 网络流 拆点建图的更多相关文章

  1. POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)

    题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...

  2. HDU 3036 Escape 网格图多人逃生 网络流||二分匹配 建图技巧

    题意: 每一个' . '有一个姑娘, E是出口,'.'是空地 , 'X' 是墙. 每秒钟每一个姑娘能够走一步(上下左右) 每秒钟每一个出口仅仅能出去一个人 给定n*m的地图, 时限T 问全部姑娘是否能 ...

  3. hdu 2732 Leapin' Lizards (最大流 拆点建图)

    Problem Description Your platoon of wandering lizards has entered a strange room in the labyrinth yo ...

  4. 图论--网络流--最大流--POJ 3281 Dining (超级源汇+限流建图+拆点建图)

    Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, an ...

  5. hdu 2732 Leapin' Lizards 最大流 拆点 建图

    题目链接 题意 给定一张网格,格子中有些地方有柱子,有些柱子上面有蜥蜴. 每个柱子只能承受有限只蜥蜴从上面经过.每只蜥蜴每次能走到相距曼哈顿距离\(\leq k\)的格子中去. 问有多少只蜥蜴能走出网 ...

  6. 网络流--最大流--POJ 2139(超级源汇+拆点建图+二分+Floyd)

    Description FJ's cows really hate getting wet so much that the mere thought of getting caught in the ...

  7. poj 3281 Dining 网络流-最大流-建图的题

    题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...

  8. poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新

    题目大意:是有M个猪圈,N个顾客,顾客要买猪,神奇的是顾客有一些猪圈的钥匙而主人MIRKO却没有钥匙,多么神奇?顾客可以在打开的猪圈购买任意数量的猪,只要猪圈里有足够数量的猪.而且当顾客打开猪圈后mi ...

  9. hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)

    Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

随机推荐

  1. net-snmp开发教程

    目录 1................................................................................................ ...

  2. PHP6天基础知识部分

    ---恢复内容开始--- (一).基础(PHP超文本预处理器) 1.PHP标记(2种) 1.<?php?>:大众的用法?和php之间不能有空格否则无效. 2.<??>:小众的用 ...

  3. ACM-ICPC 2018 南京赛区网络预赛 C GDY(模拟)

    https://nanti.jisuanke.com/t/30992 题意 把m张牌(牌上数字范围是1-13)放到栈里n个人,每个人首次从栈顶取5张牌,轮流取取完牌后,第1个人出他手里最小的牌,然后2 ...

  4. [Android] Android 注解绑定UI View组件库 ButterKnife 的使用

    ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.是大神JakeW ...

  5. spring boot零碎知识点待补充

    @Controller 和@RestController的区别 @RestController相当于同时使用了@Controller和@ResponseBody  即不会使用视图解析器,返回值直接返回 ...

  6. Windows Server 2008 R2中无法使用360免费Wifi的解决方案

    为了使主机和虚拟机在同一个无线网络中,而虚拟机的系统是Windows Server 2008 R2 64位的,使用360免费wifi,始终无法开启.在网上查找解决方案,终于找到了原因:Windows ...

  7. glide:4.7.1 与 26.1.0冲突

    implementation 'com.android.support:support-v4:26.1.0'implementation 'com.github.bumptech.glide:glid ...

  8. 15个新鲜出炉的 Photoshop 文本效果教程

    文本效果可能是 Photoshop 图形设计中最常用和最通用的技术之一.最重要的是你可以使用任何效果,风格或纹理来产生有趣的排版,越多人尝试过它并制作了一些精彩的教程.所以这篇文章旨在为您提供全面的 ...

  9. oracle 重建索引以及导出所有的索引脚本(可以解决还原数据库文件时先还原数据,在重新用脚本创建索引)

    导出数据库备份文件 1. 备份服务器数据,采用并行方式,加快备份速度(文件日期根据具体操作日期修改) expdp jhpt/XXXX directory=databackup dumpfile=dpf ...

  10. bebugger调试理解commonJS原理

    上面图片是bebugger一个导入的模块,使用vscode可以轻松的看到调用栈,通过断点调试进入断点 Mode函数的原型里面有一个require方法,函数里面有Module._load()加载模块,传 ...