/*      题意:每一个人都有喜欢的吃的和喝的,每一个人只选择一个数量的吃的和一个数量的喝的,问能满足最多的人数!?    思路:建图很是重要!f-food, p-people, d-drink    建图:  0(源点)--->f--->p---->p'---->d--->t(汇点)            将人拆分很是重要,因为每一个人最多只能有一种选择,也就是p--->p'的最大流量是 1!        如果还是不清楚,看一看下图的例子,将人拆分与不拆分的区别!                           */  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<algorithm>
  5 #include<vector>
  6 #include<queue>
  7 #define N 850
  8 #define M 201000
  9 #define INF 0x3f3f3f3f
 10 using namespace std;
 11
 12 struct EDGE{
 13     int v, cap, nt;
 14 };
 15
 16 int first[N];
 17 EDGE g[M];
 18 int cnt;
 19 int n, f, d;
 20
 21 void addEdge(int u, int v, int cap){
 22     g[cnt].v=v;
 23     g[cnt].cap=cap;
 24     g[cnt].nt=first[u];
 25     first[u]=cnt++;
 26
 27     g[cnt].v=u;
 28     g[cnt].cap=0;
 29     g[cnt].nt=first[v];
 30     first[v]=cnt++;
 31 }
 32
 33 int ans, ss;
 34
 35 queue<int>q;
 36 int dist[N];
 37
 38 bool bfs(){
 39     memset(dist, 0, sizeof(dist));
 40     dist[0]=1;
 41     q.push(0);
 42     while(!q.empty()){
 43           int u=q.front();
 44         q.pop();
 45         for(int e=first[u]; ~e; e=g[e].nt){
 46                int v=g[e].v;
 47             int cap=g[e].cap;
 48             if(!dist[v] && cap>0){
 49                 dist[v]=dist[u]+1;
 50                 q.push(v);
 51             }
 52         }
 53     }
 54     if(dist[ss+1]==0) return false;
 55     return true;
 56 }
 57
 58 int dfs(int u, int flow){
 59     int ff;
 60     if(u==ss+1) return flow;
 61     for(int e=first[u]; ~e; e=g[e].nt){
 62         int v=g[e].v;
 63         int cap=g[e].cap;
 64         if(dist[v]==dist[u]+1 && cap>0 && (ff=dfs(v, min(cap, flow)))){
 65             g[e].cap-=ff;
 66             g[e^1].cap+=ff;
 67             return ff;
 68         }
 69      }
 70     dist[u]=-1;//表示u节点不能到达汇点!
 71     return 0;
 72 }
 73
 74 void Dinic(){
 75     ans=0;
 76     int d;
 77     while(bfs())
 78          while(d=dfs(0, INF))
 79             ans+=d;
 80 }
 81
 82 int main(){
 83     while(scanf("%d%d%d", &n, &f, &d)!=EOF){
 84         ss=2*n+f+d;
 85         cnt=0;
 86         memset(first, -1, sizeof(first));
 87         for(int i=1; i<=f; ++i){//源点到吃的建一条有向边,最大流量为吃的的数量
 88             int x;
 89             scanf("%d", &x);
 90             addEdge(0, i, x);
 91         }
 92
 93         for(int i=1; i<=d; ++i){//喝的到汇点建一条有向边,最大流量为喝的的数量
 94             int x;
 95             scanf("%d", &x);
 96             addEdge(n*2+f+i, ss+1, x);
 97         }
 98         for(int i=1; i<=n; ++i){//吃的到人建一条有向边,最大流量为1
 99             getchar();
100             for(int j=1; j<=f; ++j){
101                 char ch;
102                 scanf("%c", &ch);
103                 if(ch=='Y')
104                     addEdge(j, f+i, 1);
105             }
106         }
107
108         for(int i=1; i<=n; ++i){//人到喝的建一条有向边,最大流量为1
109             addEdge(f+i, n+f+i, 1);//人属于节点容量,将人进行拆分,因为每一个人只能有一种选择!
110             getchar();
111             for(int j=1; j<=d; ++j){
112                 char ch;
113                 scanf("%c", &ch);
114                 if(ch=='Y')
115                     addEdge(n+f+i, f+n*2+j, 1);
116             }
117         }
118
119         Dinic();
120         printf("%d\n", ans);
121     }
122     return 0;
123 }

转载于:https://www.cnblogs.com/hujunzheng/p/3950737.html

hdu4292Food(最大流Dinic算法)相关推荐

  1. 图论 —— 网络流 —— 最大流 —— Dinic 算法

    [概述] Dinic 算法在 EK 算法的基础上进行了优化,其时间复杂度为 O(n*n*m). Dinic 在找增广路的时也是找最短增广路, 但与 EK 算法不同的是 Dinic 算法并不是每次 bf ...

  2. 网络流最大流 Dinic算法模板

    Dinic算法跟EK算法的优化地方就在于,EK是每次bfs记录前驱结点,然后从汇点找到一条回到源点的路. 而dinic是bfs记录深度,不断从源点dfs到汇点并且更新路径流量,直到dfs不到汇点. 邻 ...

  3. hdu4280 Island Transport 网络流最大流 Dinic算法高效模板

    Island Transport In the vast waters far far away, there are many islands. People are living on the i ...

  4. dinic (最大流) 算法 讲解

    网络流入门-用于最大流的Dinic算法 转自:http://comzyh.tk/blog/archives/568/ "网络流博大精深"-sideman语 一个基本的网络流问题 感 ...

  5. Dinic算法----最大流常用算法之一

    --没有什么是一个BFS或一个DFS解决不了的:如果有,那就两个一起. 最大流的$EK$算法虽然简单,但时间复杂度是$O(nm^2)$,在竞赛中不太常用. 竞赛中常用的$Dinic$算法和$SAP$, ...

  6. 最大流EK和Dinic算法

    最大流EK和Dinic算法 EK算法 最朴素的求最大流的算法. 做法:不停的寻找增广路,直到找不到为止 代码如下: @Frosero #include <cstdio> #include ...

  7. 网络流初步:最大流(Dinic算法)

    网络流初步:最大流 标签: 网络流 最大流 Dinic 最大流 例题 POJ****(USACO4.2.1) 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水 ...

  8. 网络流-最大流(Ford-Fulkerson算法Dinic算法)

    文章目录 最大流 FF算法: 增广路: 反边: 代码: Dinic算法: Dinic + 当前弧优化 最大流 就如同水流,存在一张图,既有起点又有终点,从起点流向终点的最大流量就是最大流. 在上面的图 ...

  9. 最大流算法模板:EK和dinic算法

    最大流算法模板:EK和dinic算法 一.EK算法模板 #include<iostream> #include<queue> using namespace std; cons ...

最新文章

  1. 【spring】使用spring的环境配置及从官网获得配置文件所用代码的方法
  2. 币圈老人李启元站队BCH,背后的原因是什么?
  3. 【aelf开发者社区招募】重构 C#代码--中高级工程师预期小半天到一天
  4. python现在好找工作吗-推崇Python这么多人,为什么他们找不到工作!
  5. “兴趣社区2.0”俘获年轻人
  6. Python学习笔记:函数
  7. 1.0jpa 2.0_JPA 2.1实体图–第1部分:命名实体图
  8. 1062 最简分数(PAT乙级 C++)
  9. 第十二届全国大学生服务外包创新创业大赛总结
  10. 网络编程+并发编程总结
  11. dvwa通关教程超详细
  12. 产品经理从专能到全能——不再虚无缥缈的用户体验
  13. FX5U modbustcp通讯
  14. 项目型销售之定义与特点简介
  15. 百度paddlepaddle《青春有你2》技术打卡五天学习总结与创意赛参加
  16. springboot(十)SpringBoot消息中间件RabbitMQ
  17. UE4蓝图案例:媒体播放器的开关1
  18. php报纸源码,PHP报纸在线阅读程序 电子读报系统 杂志在线阅读源码 DM阅读源码...
  19. How to be a Star Engineer
  20. 伯努利随机序列 matlab,Bernoullibin-随机信号源-simulink-MatLab

热门文章

  1. uni-app集成uview
  2. Zookeeper UI管理界面安装
  3. SLF4J:Failed to load class org.slf4j.impl.StaticLoggerBinder
  4. Apache ActiveMQ 各个版本所依赖的JDK版本
  5. Win10无管理员帐户,如何把自己提权为管理员
  6. 企业实战(Jenkins+GitLab+SonarQube)_12_Jenkins+soanr服务器搭建和代码检查
  7. matlab和robotstudio,MATLAB与Robotstudio建立socket通信(初探)
  8. 2020洪灾地图_卫星地图看洪灾:为何湖北易发洪水?
  9. C语言 指针数组和数组指针区别 - C语言零基础入门教程
  10. java定义变量的输入_Terraform中输入变量