题意:
有n个人,f种食物和d种饮料,每种饮料和食物的个数已知,假设一个人拿到一个自己喜欢的食物或饮料,那个人就会感到满足。
最多能有几个人满足?

思路:拆点建图。

一个人必须又要饮料又要食物,假设我们直接用食物和饮料把一个人连接起来,是无法保证每个人只会给一组食物饮料的,有可能会出现很多组食物和饮料通过着一个人经过的情况。

所以我们把点转化成边进行限制,让边的流量为1,这样就可以每个人只吃一组食物饮料了。

图如下所建。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;const int maxn = 2000;
const int maxm = 1e6+10;struct edge{long long to, next, cap, flow;  // 容量 和 流量
}e[maxm << 1]; int head[maxn], tot;
int n, m, s, t, d[maxn], cur[maxn]; // d[]分层,cur[]弧优化inline void addedge(int u, int v, int w) {e[++tot] = {v, head[u], w, 0}, head[u] = tot;e[++tot] = {u, head[v], 0, 0}, head[v] = tot;
}inline bool bfs() { // 分层 t-s路径优化memset(d, 0x3f, sizeof d);queue<int> q; q.push(t);d[t] = 0;while(!q.empty()) {int x = q.front(); q.pop();for(int i = head[x]; ~i; i = e[i].next) {int j = e[i].to;if (d[j] == d[0] && e[i^1].cap > e[i^1].flow) {d[j] = d[x] + 1;if (j == s) return true;q.push(j);}}}return false;
}long long dfs(int x, long long flow, long long used = 0) {   //used多路增广if (x == t) return flow;//for(int i = cur[x]; ~i && flow != used; i = e[ cur[x] = i ].next) {  // 当前弧优化for(int i = head[x]; ~i && flow != used; i = e[i].next) {long long j = e[i].to, f;if (d[x] - 1 == d[j] && e[i].cap > e[i].flow) {f = dfs(j, min(e[i].cap-e[i].flow, flow-used));if (f) e[i].flow += f, e[i^1].flow -= f, used += f;}}if (!used) d[x] = 0;   // 剪枝优化return used;
}int dinic(){long long maxflow = 0;while(bfs()) {   // 每次dfs分层都能找到多条增广路//memcpy(cur, head, sizeof head);maxflow += dfs(s, INT_MAX);}return maxflow;
}
int food[210],drink[210];
string s1[210],s2[210];
int f,dd;
void init(){memset(head,-1,sizeof head);tot=-1;
}int sol(){for(int i=1;i<=f;i++) addedge(s,i,food[i]);   //边连吃的for(int i=1;i<=n;i++){    //吃的连人for(int j=0;j<s1[i].size();j++){if(s1[i][j]=='Y'){addedge(j+1,i+f,1);}}}for(int i=1;i<=n;i++){   //人连人addedge(f+i,f+n+i,1);}for(int i=1;i<=n;i++){for(int j=0;j<s2[i].size();j++){if(s2[i][j]=='Y'){addedge(f+n+i,f+2*n+j+1,1);}}}for(int i=1;i<=dd;i++){addedge(f+2*n+i,t,drink[i]);}int res=dinic();return res;
}int main(){while(cin>>n>>f>>dd){init();s=0,t=f+dd+2*n+1;for(int i=1;i<=f;i++)  cin>>food[i];for(int i=1;i<=dd;i++) cin>>drink[i];for(int i=1;i<=n;i++) cin>>s1[i];for(int i=1;i<=n;i++) cin>>s2[i];cout<<sol()<<endl;}}

Food HDU - 4292 网络流相关推荐

  1. HDU 4292 Food (成都赛区网络赛第五题,拆点网络流)

      题意:跟POJ3281基本上一样的拆点网络流. 建图:建一超级源点和一超级汇点,源点与食物相连,边权为其数量,汇点与饮料相连,边权也为其数量,把人分成两个点,之间的边权为1.每个人与之需要的食物和 ...

  2. hdu 4292 Food 最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4292 You, a part-time dining service worker in your c ...

  3. HDU 3338 网络流 建图

    原题位置http://acm.hdu.edu.cn/showproblem.php?pid=3338 这道题的意思就是 给你一个由黑白方格构成的图 白方格全部空着 黑方格有的会有数字 在左下角的数字表 ...

  4. HDU - 2828 网络流

    题目大意 有n个灯,m个开关,由于线路乱接导致可能有多个开关对应一个灯(并联),有的灯在开关开的时候亮 有的灯在开关关的时候亮,[每个开关最多对应两盏灯],试找出一种开关的ON,OFF状态,使得所有灯 ...

  5. HDU 4292 Food(dinic +拆点)

    题目链接 我做的伤心了,不知是模版效率低,还是错了,交上就是TLE,找了份别人的代码,改了好几下终于过了.. 1 #include <cstdio> 2 #include <cstr ...

  6. HDU - 4292 Food(最大流+思维建边)

    题目链接:点击查看 题目大意:作为食堂管理人,现在有n个学生需要打饭,每个学生需要一个饮料和食物才能满足,每个学生可以同时接受多种不同的食物和饮料,现在给出每种食物和饮料的个数,问最多能让多少学生满足 ...

  7. 2012成都网络赛赛后【缺CHJ】

    A Coder (HDU 4288,与Codeforces 85D相同) 应该用线段树写,我是块状链表水过了 #include<map>#include<cstdio>#inc ...

  8. 解题报告:【kuangbin带你飞】专题十一 网络流

    目录 A.POJ 3436 ACMComputerFactoryACM\ Computer\ FactoryACM Computer Factory[省选/NOI- ] B.POJ 3281 Dini ...

  9. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

最新文章

  1. redis sentinel集群配置及haproxy配置
  2. Codeforces Round #367 (Div. 2)
  3. 6D姿态估计和3D 目标检测(区别)
  4. python处理表格-python如何处理表格?
  5. 不同操作系统之间的网络配置
  6. Google Chrome —— Windows 10 下谷歌浏览器所有页面崩溃(黑屏)问题解决方案
  7. PTA第3章-2 查验身份证 (15 分)
  8. 桃李春蛋糕的配料之一 - 蛋糕预拌粉
  9. python入门之运算符的使用的答案_python入门教程之基本算术运算符
  10. 轻量级前端MVVM框架avalon - 整体架构
  11. Silverlight 3 OOB 原理
  12. TensorFlow Attention
  13. xml文件中同时满足多个条件_问与答81: 如何求一组数据中满足多个条件的最大值?...
  14. VBS操作注册表设置新建读取,删除等操作(更新中)
  15. 黑马程序员——面向对象篇之多态
  16. linux 5.8 设备的mac地址与预想的不符 已忽略,解决“eth0设备的MAC 址与预想的不符,忽略”...
  17. 关灯游戏 Lights out (二)(首行枚举+位运算,搜索全部解)
  18. 怎么修改PDF文件的内容?教你两招快来看看
  19. HTTP Basic 认证
  20. 【网红流水线车间】“制造”李佳琦们的神秘组织,到底是怎么让网红火起来的?...

热门文章

  1. Linux之编辑器 vim
  2. C运算符的优先级和结合律 图片类型展示!
  3. 轻松学Pytorch – 年龄与性别预测
  4. 基于计算机视觉的构件表面缺陷特征提取
  5. 算法 - 最好、最坏、平均复杂度
  6. “计算机之子”winter:我的前端学习路线与方法
  7. Kubernetes之路 2 - 利用LXCFS提升容器资源可见性
  8. 教学思路SQL之入门习题《学员成绩》 一、建表
  9. Nginx搭建静态网站
  10. git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)....