hdu4292Food(最大流Dinic算法)
/* 题意:每一个人都有喜欢的吃的和喝的,每一个人只选择一个数量的吃的和一个数量的喝的,问能满足最多的人数!? 思路:建图很是重要!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算法)相关推荐
- 图论 —— 网络流 —— 最大流 —— Dinic 算法
[概述] Dinic 算法在 EK 算法的基础上进行了优化,其时间复杂度为 O(n*n*m). Dinic 在找增广路的时也是找最短增广路, 但与 EK 算法不同的是 Dinic 算法并不是每次 bf ...
- 网络流最大流 Dinic算法模板
Dinic算法跟EK算法的优化地方就在于,EK是每次bfs记录前驱结点,然后从汇点找到一条回到源点的路. 而dinic是bfs记录深度,不断从源点dfs到汇点并且更新路径流量,直到dfs不到汇点. 邻 ...
- hdu4280 Island Transport 网络流最大流 Dinic算法高效模板
Island Transport In the vast waters far far away, there are many islands. People are living on the i ...
- dinic (最大流) 算法 讲解
网络流入门-用于最大流的Dinic算法 转自:http://comzyh.tk/blog/archives/568/ "网络流博大精深"-sideman语 一个基本的网络流问题 感 ...
- Dinic算法----最大流常用算法之一
--没有什么是一个BFS或一个DFS解决不了的:如果有,那就两个一起. 最大流的$EK$算法虽然简单,但时间复杂度是$O(nm^2)$,在竞赛中不太常用. 竞赛中常用的$Dinic$算法和$SAP$, ...
- 最大流EK和Dinic算法
最大流EK和Dinic算法 EK算法 最朴素的求最大流的算法. 做法:不停的寻找增广路,直到找不到为止 代码如下: @Frosero #include <cstdio> #include ...
- 网络流初步:最大流(Dinic算法)
网络流初步:最大流 标签: 网络流 最大流 Dinic 最大流 例题 POJ****(USACO4.2.1) 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水 ...
- 网络流-最大流(Ford-Fulkerson算法Dinic算法)
文章目录 最大流 FF算法: 增广路: 反边: 代码: Dinic算法: Dinic + 当前弧优化 最大流 就如同水流,存在一张图,既有起点又有终点,从起点流向终点的最大流量就是最大流. 在上面的图 ...
- 最大流算法模板:EK和dinic算法
最大流算法模板:EK和dinic算法 一.EK算法模板 #include<iostream> #include<queue> using namespace std; cons ...
最新文章
- 【spring】使用spring的环境配置及从官网获得配置文件所用代码的方法
- 币圈老人李启元站队BCH,背后的原因是什么?
- 【aelf开发者社区招募】重构 C#代码--中高级工程师预期小半天到一天
- python现在好找工作吗-推崇Python这么多人,为什么他们找不到工作!
- “兴趣社区2.0”俘获年轻人
- Python学习笔记:函数
- 1.0jpa 2.0_JPA 2.1实体图–第1部分:命名实体图
- 1062 最简分数(PAT乙级 C++)
- 第十二届全国大学生服务外包创新创业大赛总结
- 网络编程+并发编程总结
- dvwa通关教程超详细
- 产品经理从专能到全能——不再虚无缥缈的用户体验
- FX5U modbustcp通讯
- 项目型销售之定义与特点简介
- 百度paddlepaddle《青春有你2》技术打卡五天学习总结与创意赛参加
- springboot(十)SpringBoot消息中间件RabbitMQ
- UE4蓝图案例:媒体播放器的开关1
- php报纸源码,PHP报纸在线阅读程序 电子读报系统 杂志在线阅读源码 DM阅读源码...
- How to be a Star Engineer
- 伯努利随机序列 matlab,Bernoullibin-随机信号源-simulink-MatLab
热门文章
- uni-app集成uview
- Zookeeper UI管理界面安装
- SLF4J:Failed to load class org.slf4j.impl.StaticLoggerBinder
- Apache ActiveMQ 各个版本所依赖的JDK版本
- Win10无管理员帐户,如何把自己提权为管理员
- 企业实战(Jenkins+GitLab+SonarQube)_12_Jenkins+soanr服务器搭建和代码检查
- matlab和robotstudio,MATLAB与Robotstudio建立socket通信(初探)
- 2020洪灾地图_卫星地图看洪灾:为何湖北易发洪水?
- C语言 指针数组和数组指针区别 - C语言零基础入门教程
- java定义变量的输入_Terraform中输入变量