题意:有n头牛,f种食物,d种饮料,每头牛有自己喜欢的食物和饮料,问你最多能够几头牛搭配好,每种食物或者饮料只能一头牛享用;

解题思路:把牛拆点,因为流过牛的流量是由限制的,只能为1,然后,食物和牛的入点相连,牛的出点和饮料相连,求解最大流

代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<queue>
  6. using namespace std;
  7. const int maxn=200500;
  8. const int inf=0x3f3f3f3f;
  9. struct Edge
  10. {
  11. int fa;
  12. int next;
  13. int to;
  14. int w;
  15. }edge[maxn];
  16. int n,m,f,d;
  17. int head[maxn];
  18. int cnt,Start,End;
  19. int x,y,w;
  20. int depth[maxn];
  21. void add(int u,int v,int w)
  22. {
  23. //cout<<u<<" "<<v<<endl;
  24. edge[cnt].next=head[u];edge[cnt].fa=u;
  25. edge[cnt].to=v;edge[cnt].w=w;head[u]=cnt++;
  26. edge[cnt].next=head[v];edge[cnt].fa=v;
  27. edge[cnt].to=u;edge[cnt].w=0;head[v]=cnt++;
  28. }
  29. bool bfs()//分层;
  30. {
  31. memset(depth,0,sizeof(depth));
  32. queue<int>q;
  33. q.push(Start);
  34. depth[Start]=1;
  35. while(!q.empty())
  36. {
  37. int temp=q.front();
  38. q.pop();
  39. for(int i=head[temp];i!=-1;i=edge[i].next)
  40. {
  41. int v=edge[i].to;
  42. if(depth[v]||edge[i].w<=0)
  43. continue;
  44. depth[v]=depth[temp]+1;
  45. q.push(v);
  46. }
  47. }
  48. return depth[End];//若为0表示没法到达也就是没有路径了;
  49. }
  50. int dfs(int u,int maxflow)
  51. {
  52. if(u==End)
  53. return maxflow;
  54. int add=0;
  55. for(int i=head[u];i!=-1&&add<maxflow;i=edge[i].next)
  56. {
  57. int v=edge[i].to;
  58. if(depth[v]!=depth[u]+1)
  59. continue;
  60. if(edge[i].w==0)
  61. continue;
  62. int tempflow=dfs(v,min(edge[i].w,maxflow-add));
  63. edge[i].w-=tempflow;
  64. edge[i^1].w+=tempflow;
  65. add+=tempflow;
  66. }
  67. return add;
  68. }
  69. int dinic()
  70. {
  71. int ans=0;
  72. while(bfs())
  73. {
  74. ans+=dfs(Start,0x3f3f3f3f);
  75. }
  76. return ans;
  77. }
  78. int main()
  79. {
  80. int tmp;
  81. memset(head,-1,sizeof(head));
  82. scanf("%d%d%d",&n,&f,&d);
  83. Start=0;End=2*n+f+d+1;
  84. for(int i=1;i<=n;i++)
  85. add(i,i+n,1);
  86. for(int i=2*n+1;i<=2*n+f;i++)
  87. add(Start,i,1);
  88. for(int i=2*n+f+1;i<=2*n+f+d;i++)
  89. add(i,End,1);
  90. for(int i=1;i<=n;i++)
  91. {
  92. scanf("%d%d",&x,&y);
  93. for(int j=1;j<=x;j++)
  94. {
  95. scanf("%d",&tmp);
  96. add(tmp+2*n,i,1);
  97. }
  98. for(int j=1;j<=y;j++)
  99. {
  100. scanf("%d",&tmp);
  101. add(i+n,tmp+2*n+f,1);
  102. }
  103. }
  104. int ans=dinic();
  105. printf("%d\n",ans);
  106. }

  

poj-3281(拆点+最大流)的更多相关文章

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

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

  2. POJ 3281 Dining(最大流)

    http://poj.org/problem?id=3281 题意: 有n头牛,F种食物和D种饮料,每头牛都有自己喜欢的食物和饮料,每种食物和饮料只能给一头牛,每头牛需要1食物和1饮料.问最多能满足几 ...

  3. poj 3281 Dining【最大流】

    记得把牛拆掉!拆成两个点i和i'在中间连一条流量为1的边,来限制每头牛只能选一组 一般来讲是一种物品一个消费者各占一边,但是这里有两个物品,所以考虑把牛放在中间,s向所有的食物连流量为1的边,所有食物 ...

  4. POJ 3281 Dining 网络流最大流

    B - DiningTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.ac ...

  5. poj 3281 最大流+建图

    很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...

  6. POJ 3281 Dining(最大流)

    POJ 3281 Dining id=3281" target="_blank" style="">题目链接 题意:n个牛.每一个牛有一些喜欢的 ...

  7. poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap

    poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...

  8. POJ 3281 网络流 拆点保证本身只匹配一对食物和饮料

    如何建图? 最开始的问题就是,怎么表示一只牛有了食物和饮料呢? 后来发现可以先将食物与牛匹配,牛再去和饮料匹配,实际上这就构成了三个层次. 起点到食物层边的容量是1,食物层到奶牛层容量是1,奶牛层到饮 ...

  9. POJ 3281 Dining (网络流)

    POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...

  10. POJ 3281 网络流dinic算法

    B - Dining Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

随机推荐

  1. JavaScript 代码简洁之道

    摘要: 可以说是<Clean Code>的JS代码示例了,值得参考. 原文:JavaScript 代码简洁之道 作者:缪宇 Fundebug经授权转载,版权归原作者所有. 测试代码质量的唯 ...

  2. android如何获取SHA1

    某些Google Play服务(例如Google登录和App Invites)要求我们提供签名证书的SHA-1,以便google paly为我们的应用创建OAuth2客户端和API密钥. 那么如何获取 ...

  3. 2019Java查漏补缺(一)

    看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...

  4. Django 事务操作

    如何在Django中进行事务操作 案例: 客户A要给客户B转一笔钱,这个在数据库中需要进行两步: 1.客户A减钱 2.客户B加钱 如果在第一步结束后,服务器出现异常,停下了,第二步没有进行,如果数据库 ...

  5. Kafka相关内容总结(概念和原理)

    说明 主要内容是在网上的一些文章中整理出来: 加粗的字体是比较重要的内容,部分是自己的经验和理解: 整理的目的主要是为了方便查阅: 为什么需要消息系统 解耦: 在项目启动之初来预测将来项目会碰到什么需 ...

  6. 【公众号系列】SAP的新零售

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP的新零售   写在前面 还是 ...

  7. 伙伴系统之伙伴系统概述--Linux内存管理(十五)

    在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法. Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, ...

  8. c/c++ 多线程 unique_lock的使用

    多线程 unique_lock的使用 unique_lock的特点: 1,灵活.可以在创建unique_lock的实例时,不锁,然后手动调用lock_a.lock()函数,或者std::lock(lo ...

  9. "'cl' 不是内部或外部命令,也不是可运行的程序"解决方案

    最近使用VS2012+Qt5.1+QtCreator2.8.1来搭建Qt的开发环境(之前有用MinGW编译的经历,经常碰到gdb调试器崩溃的问题),全部换成想用VC的编译器和调试环境,但是觉得QtCr ...

  10. 三机互ping(自己总结)

    主机与虚拟机互ping设置: 点击VMware下的[编辑]--[虚拟网络编辑器]设置如下:         屏幕剪辑的捕获时间: 2016/5/21 13:10         屏幕剪辑的捕获时间: ...