很巧妙的思想

转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html

本题能够想到用最大流做,那真的是太绝了。建模的方法很妙!
题意就是有N头牛,F个食物,D个饮料。
N头牛每头牛有一定的喜好,只喜欢几个食物和饮料。
每个食物和饮料只能给一头牛。一头牛只能得到一个食物和饮料。
而且一头牛必须同时获得一个食物和一个饮料才能满足。问至多有多少头牛可以获得满足。
最初相当的是二分匹配。但是明显不行,因为要分配两个东西,两个东西还要同时满足。
最大流建图是把食物和饮料放在两端。一头牛拆分成两个点,两点之间的容量为1.喜欢的食物和饮料跟牛建条边,容量为1.
加个源点和汇点。源点与食物、饮料和汇点的边容量都是1,表示每种食物和饮料只有一个。
这样话完全是最大流问题了,。

Sample Input

  1. 4 3 3
  2. 2 2 1 2 3 1  //1号牛喜欢2种食物(1,2)2种饮料(3,1)
  3. 2 2 2 3 1 2
  4. 2 2 1 3 1 2
  5. 2 1 1 3 3

Sample Output

  1. 3
  1.  
  1. /*
  2. POJ 3281 最大流
  3. //源点-->food-->牛(左)-->牛(右)-->drink-->汇点
  4. //精髓就在这里,牛拆点,确保一头牛就选一套food和drink的搭配
  5.  
  6. */
  7.  
  8. #include<stdio.h>
  9. #include<iostream>
  10. #include<string.h>
  11. #include<algorithm>
  12. #include<queue>
  13. using namespace std;
  14.  
  15. //****************************************************
  16. //最大流模板
  17. //初始化:g[][],start,end
  18. //******************************************************
  19. const int MAXN=;
  20. const int INF=0x3fffffff;
  21. int g[MAXN][MAXN];//存边的容量,没有边的初始化为0
  22. int path[MAXN],flow[MAXN],start,end;
  23. int n;//点的个数,编号0-n.n包括了源点和汇点。
  24.  
  25. queue<int>q;
  26. int bfs()
  27. {
  28. int i,t;
  29. while(!q.empty())q.pop();//把清空队列
  30. memset(path,-,sizeof(path));//每次搜索前都把路径初始化成-1
  31. path[start]=;
  32. flow[start]=INF;//源点可以有无穷的流流进
  33. q.push(start);
  34. while(!q.empty())
  35. {
  36. t=q.front();
  37. q.pop();
  38. if(t==end)break;
  39. //枚举所有的点,如果点的编号起始点有变化可以改这里
  40. for(i=;i<=n;i++)
  41. {
  42. if(i!=start&&path[i]==-&&g[t][i])
  43. {
  44. flow[i]=flow[t]<g[t][i]?flow[t]:g[t][i];
  45. q.push(i);
  46. path[i]=t;
  47. }
  48. }
  49. }
  50. if(path[end]==-)return -;//即找不到汇点上去了。找不到增广路径了
  51. return flow[end];
  52. }
  53. int Edmonds_Karp()
  54. {
  55. int max_flow=;
  56. int step,now,pre;
  57. while((step=bfs())!=-)
  58. {
  59. max_flow+=step;
  60. now=end;
  61. while(now!=start)
  62. {
  63. pre=path[now];
  64. g[pre][now]-=step;
  65. g[now][pre]+=step;
  66. now=pre;
  67. }
  68. }
  69. return max_flow;
  70. }
  71. int main()
  72. {
  73. int N,F,D;
  74. while(scanf("%d%d%d",&N,&F,&D)!=EOF)
  75. {
  76. memset(g,,sizeof(g));
  77. n=F+D+*N+;
  78. start=;
  79. end=n;
  80. for(int i=;i<=F;i++)g[][i]=;
  81. for(int i=F+*N+;i<=F+*N+D;i++)g[i][n]=;
  82. for(int i=;i<=N;i++)g[F+*i-][F+*i]=;
  83. int k1,k2;
  84. int u;
  85. for(int i=;i<=N;i++)
  86. {
  87. scanf("%d%d",&k1,&k2);
  88. while(k1--)
  89. {
  90. scanf("%d",&u);
  91. g[u][F+*i-]=;
  92. }
  93. while(k2--)
  94. {
  95. scanf("%d",&u);
  96. g[F+*i][F+*N+u]=;
  97. }
  98. }
  99. printf("%d\n",Edmonds_Karp());
  100. }
  101. return ;
  102. }

poj 3281 最大流+建图的更多相关文章

  1. poj 3281 最大流建图

    题目链接:http://poj.org/problem?id=3281 #include <cstdio> #include <cmath> #include <algo ...

  2. [poj 3281]最大流+建图很巧妙

    题目链接:http://poj.org/problem?id=3281 看了kuangbin大佬的思路,还用着kuangbin板子orz   http://www.cnblogs.com/kuangb ...

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

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

  4. poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙

    /** 题目:poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙 链接:http://poj.org/problem?id=3680 题意:给定n个区间,每个区间(ai,bi ...

  5. hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙

    /** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...

  6. 图论--网络流--最小割 HDU 2485 Destroying the bus stations(最短路+限流建图)

    Problem Description Gabiluso is one of the greatest spies in his country. Now he's trying to complet ...

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

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

  8. poj 2135 Farm Tour 最小费用最大流建图跑最短路

    题目链接 题意:无向图有N(N <= 1000)个节点,M(M <= 10000)条边:从节点1走到节点N再从N走回来,图中不能走同一条边,且图中可能出现重边,问最短距离之和为多少? 思路 ...

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

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

随机推荐

  1. ios 清理缓存

    //拿到要清理的路径,其实就是caches的路径,一般像这种很多地方都会用到的地方真好搞成宏,不过现在苹果不提倡用宏了 //在swift中可以定义成全局的常量 //遍历caches,将内部的文件大小计 ...

  2. 使用Redis SETNX 命令实现分布式锁

    基于setnx和getset http://blog.csdn.net/lihao21/article/details/49104695 使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其 ...

  3. LinkedBlockingQueue和ConcurrentLinkedQueue详细用法

    1.LinkedBlockingQueue<E>:java.util.concurrent API中的解释: public class LinkedBlockingQueue<E&g ...

  4. Connect the Cities(MST prim)

    Connect the Cities Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  5. 入侵检测课设之Libnids开发包

    Libnids开发包介绍     Libnids是一个用于网络入侵检测开发的专业编程接口,它使用了Libpcap所以它具有捕获数据包的功能.同时,Libnids提供了TCP数据流重组功能,所以对于分析 ...

  6. 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)

    在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...

  7. linux 系统下查看raid信息,以及磁盘信息

    有时想知道服务器上有几块磁盘,如果没有做raid,则可以简单使用fdisk -l  就可以看到. 但是做了raid呢,这样就看不出来了.那么如何查看服务器上做了raid? 软件raid:只能通过Lin ...

  8. object-c面向对象1

    ---恢复内容开始--- 类,对象,方法,属性. 类是object-c一种重要的数据类型,是组成object-c程序的基本要素.object-c的类声明和实现包括两个部分:接口和实现部分. @inte ...

  9. HTML页面表单输入框去掉鼠标选中后边框变色的效果

    标题说的有些含糊,实在不知道怎么描述了,就简单说一下吧,一个最简单的表单,代码如下,没有任何样式和名字, <!DOCTYPE html> <html> <head> ...

  10. Simple Chroma Key 0.1.16 图片抠像(vs2003) 无任何插件

    学习扣像的最基础代码 (只支持 BMP TGA) simplechromakey.rar