题目链接:https://vjudge.net/problem/POJ-3281

题目:有不同种类的食物和饮料,每种只有1个库存,有N头牛,每头牛喜欢某些食物和某些饮料,但是一头牛

只能吃一种食物和喝一种饮料,问怎么分配食物和饮料才能让最多数量的牛饱餐。

思路:容易想到  食物->牛->饮料的流,当然一个牛可以被多个饮料流到,需要把牛拆成入点和出点,入点和出点流量为1,这样可以保证牛只吃或者喝某种食物和饮料,别的都流是套路,除了牛的分点之间流量为1,别的连接设置成1或者INF都一样,因为有牛的分点流量的限制。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <queue>
  5. using namespace std;
  6.  
  7. const int N = ,INF = (int)1e9;
  8. int n,F,D,tot,S,T;
  9. int head[N],lev[N];
  10. queue<int > que;
  11. struct node{
  12. int to,nxt,flow;
  13. }e[N*N];
  14.  
  15. inline void add(int u,int v,int flow){
  16. e[tot].to = v;
  17. e[tot].flow = flow;
  18. e[tot].nxt = head[u];
  19. head[u] = tot++;
  20. e[tot].to = u;
  21. e[tot].flow = ;
  22. e[tot].nxt = head[v];
  23. head[v] = tot++;
  24. }
  25.  
  26. void build_map(int s,int t){
  27.  
  28. for(int i = s; i <= t; ++i) head[i] = -; tot = ;
  29. //读入信息 0是源点 1~F食物 F+1~F+2*n牛 F+2*n+1~F+2*n+D饮料 F+2*n+D+1是汇点
  30. int kind_f,kind_d,x;
  31. for(int i = ; i <= n; ++i){
  32. scanf("%d%d",&kind_f,&kind_d);
  33. for(int j = ; j <= kind_f; ++j){
  34. scanf("%d",&x);
  35. add(x,F+i,);// add(F+i,x,0);
  36. }
  37. for(int j = ; j <= kind_d; ++j){
  38. scanf("%d",&x);
  39. add(F+n+i,F+*n+x,);// add(F+2*n+x,F+n+i,0);
  40. }
  41. }
  42. for(int i = ; i <= F; ++i){
  43. add(s,i,);// add(i,s,0);
  44. }
  45. for(int i = ; i <= D; ++i){
  46. add(F+*n+i,t,);// add(t,F+2*n+i,0);
  47. }
  48. for(int i = ; i <= n; ++i){
  49. add(F+i,F+n+i,);// add(F+n+i,F+i,0);
  50. }
  51. }
  52.  
  53. void show(int s,int t){
  54. for(int i = s; i <= t; ++i){
  55. cout << "当前点为 " << i << " ";
  56. cout << "能去到 ";
  57. for(int o = head[i]; ~o; o = e[o].nxt){
  58. printf(" %d 流量为 %d",e[o].to,e[o].flow);
  59. }cout << endl;
  60. }
  61. }
  62.  
  63. bool bfs(int s,int t){
  64. while(!que.empty()) que.pop();
  65. for(int i = s; i <= t; ++i) lev[i] = ;
  66. lev[s] = ;
  67. que.push(s);
  68. while(!que.empty()){
  69. int u = que.front(); que.pop();
  70. for(int o = head[u]; ~o; o = e[o].nxt){
  71. int v = e[o].to;
  72. if(!lev[v] && e[o].flow ){
  73. lev[v] = lev[u] + ;
  74. if(v == t) return true;
  75. que.push(v);
  76. }
  77. }
  78. }
  79. return false;
  80. }
  81.  
  82. int dfs(int now,int flow,int t){
  83. if(now == t) return flow;
  84. int to,sum = ,tmp;
  85. for(int o = head[now]; ~o; o = e[o].nxt){
  86. to = e[o].to;
  87. if((lev[to] == lev[now] + ) && e[o].flow && (tmp = dfs(to,min(flow-sum,e[o].flow),t))){
  88. e[o].flow -= tmp;
  89. e[o^].flow += tmp;
  90. if((sum += tmp) == flow) return sum;
  91. }
  92. }
  93. return sum;
  94. }
  95.  
  96. int mf(int s,int t){
  97. int _mf = ;
  98. while(bfs(s,t)){
  99. _mf += dfs(s,INF,t);
  100. }
  101. return _mf;
  102. }
  103.  
  104. int main(){
  105.  
  106. scanf("%d%d%d",&n,&F,&D);
  107. S = ; T = F+*n+D+;
  108. //建图
  109. build_map(S,T);
  110. // show(S,T); //图的显示
  111. int ans = mf(S,T);
  112. printf("%d\n",ans);
  113.  
  114. return ;
  115. }

kuangbin专题专题十一 网络流 Dining POJ - 3281的更多相关文章

  1. B - Dining POJ - 3281 网络流

    Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...

  2. B - Dining - poj 3281(最大流)

    题目大意:有一群牛,还有一些牛喜欢的食物和喜欢的饮料,不过这些牛都很特别,他们不会与别的牛吃同一种食物或者饮料,现在约翰拿了一些食物和饮料,同时他也知道这些牛喜欢的食物和饮料的种类,求出来最多能让多少 ...

  3. Dining POJ - 3281

    题意: f个食物,d杯饮料,每个牛都有想吃的食物和想喝的饮料,但食物和饮料每个只有一份 求最多能满足多少头牛.... 解析: 一道简单的无源汇拆点最大流   无源汇的一个最大流,先建立超级源s和超级汇 ...

  4. AC日记——Dining poj 3281

    [POJ-3281] 思路: 把牛拆点: s向食物连边,流量1: 饮料向t连边,流量1: 食物向牛1连边,流量1: 牛2向饮料连边,流量1: 最大流: 来,上代码: #include <cstd ...

  5. [kuangbin带你飞]专题十一 网络流

            ID Origin Title   34 / 81 Problem A POJ 3436 ACM Computer Factory   92 / 195 Problem B POJ 3 ...

  6. Kuangbin 带你飞专题十一 网络流题解 及模版 及上下界网络流等问题

    首先是几份模版 最大流:虽然EK很慢但是优势就是短.求最小割的时候可以根据增广时的a数组来判断哪些边是割边.然而SAP的最大流版我只会套版,并不知道该如何找到这个割边.在尝试的时候发现了一些问题.所以 ...

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

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

  8. POJ 3281 Dining (网络流)

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

  9. POJ 3281 网络流dinic算法

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

随机推荐

  1. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(开篇)

    源码下载地址:http://www.yealuo.com/Sccnn/Detail?KeyValue=c891ffae-7441-4afb-9a75-c5fe000e3d1c     这是一个比较简单 ...

  2. Linux 内核接口

    USB 端点被绑在接口中. USB 接口只处理一类 USB 逻辑连接, 例如一个鼠标, 一个键盘, 或者一个音频流. 一些 USB 设备有多个接口, 例如一个 USB 扬声器可能有 2 个接口: 一个 ...

  3. Helm Chart 一键部署 Jenkins

    Jenkins Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件.目前提供超过1000个插件来支持构建.部署.自动化, 满足任何项目的需要. Jenki ...

  4. java的package和import机制

    在说package.import机制前我们先来了解下java的CLASSPATH. CLASSPATH顾名思义就是class的路径,当我们在系统中运行某个java程序时,它就会告诉系统在这些地方寻找这 ...

  5. mysql主从之基于mycat实现读写分离

    一 环境 1.1 结构 192.168.132.125 mycat 192.168.132.121  master 192.168.132.122  slave 主从已经配置完成 1.2 安装myca ...

  6. FPGA基础入门程序代码

    module flow_led( input sys_clk , //系统时钟,外部时钟50M input sys_rst_n, //系统复位,低电平有效 :] led //4个LED灯 ); //r ...

  7. 洛谷P2858 奶牛零食 题解 区间DP入门题

    题目大意: 约翰经常给产奶量高的奶牛发特殊津贴,于是很快奶牛们拥有了大笔不知该怎么花的钱.为此,约翰购置了 \(N(1 \le N \le 2000)\) 份美味的零食来卖给奶牛们.每天约翰售出一份零 ...

  8. 负载均衡基本原理与lvs

    前言: 之前在山西的项目上使用的是lvs下的NAT模式,但另外两个模式并没有涉及,今天系统的整理下关于负载均衡的相关理论与lvs各模式的相关优点与不足,知其然与所以然,而后能针对性的应用: 基本介绍 ...

  9. C#录制视频

    这是一个使用C#语言制作的录制框架,支持录制桌面,多屏,声音,摄像头,某个应用程序的界面 1.安装 使用此框架需要安装扩展包Kogel.Record,可以Nuget上搜索 或者使用Nuget命令 In ...

  10. Ant Design Pro中Transfer穿梭框的实际用法(与后端交互)

    Ant Design Pro中Transfer穿梭框的实际用法(与后端交互) 该控件的属性以及属性的作用在ADP的官方文档中都有介绍,但没有讲如何与后端交互,本文旨在讲解该控件与后端的交互. Ant ...