传送门:Dining

题意:一些牛,一些食物,一些饮料,每头牛都有其喜欢的几种食物和几种饮料,求最多能给多少头牛即找到食物又找到饮料~也就是有多少个 牛---食物---饮料 的匹配,而且满足一一匹配,每个牛,食物,或饮料都只能使用一次。

分析:如果直接源点-食物-牛-汇点这样建图,那么可能会很多份食物通过某头牛传送过去,不能保证每头牛吃一份食物,因此拆点,把每头牛拆成牛-牛,边权为1,这样就能保证每头牛只能吃一份了。

  1. #pragma comment(linker,"/STACK:1024000000,1024000000")
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string>
  5. #include <cmath>
  6. #include <limits.h>
  7. #include <iostream>
  8. #include <algorithm>
  9. #include <queue>
  10. #include <cstdlib>
  11. #include <stack>
  12. #include <vector>
  13. #include <set>
  14. #include <map>
  15. #define LL long long
  16. #define mod 100000000
  17. #define inf 0x3f3f3f3f
  18. #define eps 1e-6
  19. #define N 500
  20. #define lson l,m,rt<<1
  21. #define rson m+1,r,rt<<1|1
  22. #define PII pair<int,int>
  23. using namespace std;
  24. inline int read()
  25. {
  26. char ch=getchar();
  27. int x=,f=;
  28. while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
  29. while(ch<=''&&ch>=''){x=x*+ch-'';ch=getchar();}
  30. return x*f;
  31. }
  32. int n,d,f,vs,vt,tot;
  33. int pre[N],q[N],cur[N],h[N];
  34. struct edge
  35. {
  36. int v,w,next;
  37. edge(){}
  38. edge(int v,int w,int next):v(v),w(w),next(next){}
  39. }e[N*N];
  40. void addedge(int u,int v,int w)
  41. {
  42. e[tot]=edge(v,w,pre[u]);
  43. pre[u]=tot++;
  44. }
  45. void init()
  46. {
  47. memset(pre,-,sizeof(pre));
  48. tot=;
  49. }
  50. /*******************dinic************************/
  51. int bfs()
  52. {
  53. int head=,tail=;
  54. memset(h,-,sizeof(h));
  55. q[]=vs;h[vs]=;
  56. while(head!=tail)
  57. {
  58. int u=q[head++];
  59. for(int i=pre[u];~i;i=e[i].next)
  60. {
  61. int v=e[i].v,w=e[i].w;
  62. if(w&&h[v]==-)
  63. {
  64. h[v]=h[u]+;
  65. q[tail++]=v;
  66. }
  67. }
  68. }
  69. return h[vt]!=-;
  70. }
  71. int dfs(int u,int flow)
  72. {
  73. if(u==vt)return flow;
  74. int used=;
  75. for(int i=cur[u];~i;i=e[i].next)
  76. {
  77. int v=e[i].v,w=e[i].w;
  78. if(h[v]==h[u]+)
  79. {
  80. w=dfs(v,min(flow-used,w));
  81. e[i].w-=w;e[i^].w+=w;
  82. if(e[i].w)cur[u]=i;
  83. used+=w;
  84. if(used==flow)return flow;
  85. }
  86. }
  87. if(!used)h[u]=-;
  88. return used;
  89. }
  90. int dinic()
  91. {
  92. int res=;
  93. while(bfs())
  94. {
  95. for(int i=vs;i<=vt;i++)cur[i]=pre[i];
  96. res+=dfs(vs,inf);
  97. }
  98. return res;
  99. }
  100. /********************dinic***********************/
  101. void build()
  102. {
  103. vs=;vt=n*+f+d+;
  104. for(int i=;i<=f;i++)addedge(vs,i,),addedge(i,vs,);
  105. for(int i=;i<=d;i++)addedge(i+*n+f,vt,),addedge(vt,i+*n+f,);
  106. for(int i=;i<=n;i++)addedge(f+i,f+n+i,),addedge(f+n+i,f+i,);
  107. for(int i=;i<=n;i++)
  108. {
  109. int m1,m2,x;
  110. m1=read();m2=read();
  111. while(m1--)
  112. {
  113. x=read();
  114. addedge(x,f+i,);
  115. addedge(f+i,x,);
  116. }
  117. while(m2--)
  118. {
  119. x=read();
  120. addedge(f+n+i,f+*n+x,);
  121. addedge(f+*n+x,f+n+i,);
  122. }
  123. }
  124. }
  125. int main()
  126. {
  127. while(scanf("%d%d%d",&n,&f,&d)>)
  128. {
  129. init();
  130. build();
  131. printf("%d\n",dinic());
  132. }
  133. }

poj3281(最大流)的更多相关文章

  1. POJ-3281(最大流+EK算法)

    Dining POJ-3281 这道题目其实也是网络流中求解最大流的一道模板题. 只要建模出来以后直接套用模板就行了.这里的建模还需要考虑题目的要求:一种食物只能给一只牛. 所以这里可以将牛拆成两个点 ...

  2. POJ3281 Dining —— 最大流 + 拆点

    题目链接:https://vjudge.net/problem/POJ-3281 Dining Time Limit: 2000MS   Memory Limit: 65536K Total Subm ...

  3. Dining(POJ-3281)【最大流】

    题目链接:https://vjudge.net/problem/POJ-3281 题意:厨师做了F种菜各一份,D种饮料各一份,另有N头奶牛,每只奶牛只吃特定的菜和饮料,问该厨师最多能满足多少头奶牛? ...

  4. POJ3281 Dining(拆点构图 + 最大流)

    题目链接 题意:有F种食物,D种饮料N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一份) 一种食物被一头牛吃了之后,其余牛就不能吃了第一行有N,F,D三个整数接着2-N+1行代表第i头牛,前面两个整 ...

  5. POJ3281 Dining 最大流

    题意:有f种菜,d种饮品,每个牛有喜欢的一些菜和饮品,每种菜只能被选一次,饮品一样,问最多能使多少头牛享受自己喜欢的饮品和菜 分析:建边的时候,把牛拆成两个点,出和入 1,源点向每种菜流量为1 2,每 ...

  6. poj-3281(拆点+最大流)

    题意:有n头牛,f种食物,d种饮料,每头牛有自己喜欢的食物和饮料,问你最多能够几头牛搭配好,每种食物或者饮料只能一头牛享用: 解题思路:把牛拆点,因为流过牛的流量是由限制的,只能为1,然后,食物和牛的 ...

  7. 2018.06.27 POJ3281 Dining(最大流)

    Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21578 Accepted: 9545 Description C ...

  8. POJ3281(KB11-B 最大流)

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19170   Accepted: 8554 Descripti ...

  9. poj3281网络流之最大流

    加一个源点和汇点,把每头牛拆成两个点,不拆点的话可能会出现多对食物与饮料被一个牛享用的情况,拆点后流量为1,不能同时通过了 然后用最大流处理,每个链接边都是1 #include<map> ...

  10. [poj3281]Dining(最大流+拆点)

    题目大意:有$n$头牛,$f$种食物和$d$种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢 ...

随机推荐

  1. [REST Jersey] @QueryParam Demo

    This demo sourced from the jersey tutor. https://jersey.java.net/documentation/latest/jaxrs-resource ...

  2. poj3278Catch That Cow(BFS)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 37094   Accepted: 11466 ...

  3. sql: 查询,select

    快速查询数据库中拥有那些表项:(类似linux中的ls, ls |grep table_name*)select * from tab where tname like 'YOUR_QERYNAME% ...

  4. Spring3.0 入门进阶(1):从配置文件装载Bean

    Spring 已经盛行多年,目前已经处于3.0阶段,关于Spring的概念介绍性的东西网上已经很多,本系列博客主要是把一些知识点通过代码的方式总结起来,以便查阅. 作为入门,本篇主要介绍Bean的加载 ...

  5. 最新 Druid 配置

    Druid是一个JDBC组件库,包括数据库连接池.SQL Parser等组件.DruidDataSource是最好的数据库连接池.下面我们就一起来在项目中配置Druid吧 1.Druid依赖配置 &l ...

  6. 在JDBC中使用PreparedStatement代替Statement,同时预防SQL注入

    本篇讲诉为何在JDBC操作数据库的过程中,要使用PreparedStatement对象来代替Statement对象. 在前面的JDBC学习中,对于Statement对象,我们已经知道是封装SQL语句并 ...

  7. Office 2013 正式版 下载地址 带正版验证

    万众期待的正式版Office 2013 降临---英文版/中文简体版 英文版软件下载地址: office_professional_plus_2013_x86_dvd en_office_profes ...

  8. 积累的VC编程小技巧之按钮

    1.资源种创建的控件,对其属性的动态控制: 在对话框类的头文件里创建所要改变属性的控件的对象,如要改变一个Button(其ID为IDC_MyButton)的属性,则需创建Cbutton的对象m_but ...

  9. 【Node.js 自己封装的库 http_parse, libuv】

    [Node.js 自己封装的库 http_parse, libuv] Node.js 介绍:一个网络框架,更多:http://www.oschina.net/p/nodejs 官网:http://no ...

  10. Database Connection Pool Library | Libzdb

    Database Connection Pool Library | Libzdb A small, easy to use Open Source Database Connection Pool ...