题意:跟POJ3281基本上一样的拆点网络流。

建图:建一超级源点和一超级汇点,源点与食物相连,边权为其数量,汇点与饮料相连,边权也为其数量,把人分成两个点,之间的边权为1。每个人与之需要的食物和饮料相连,边权为1。

代码(SAP模板):

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <cstdio>
  5 #include <queue>
  6 using namespace std;
  7 const int maxn=101050;
  8 const int maxm=3000000;
  9 const int oo=1<<30;
 10 int idx,N,F,D;
 11 int cur[maxn],pre[maxn];
 12 int dis[maxn],gap[maxn];
 13 int aug[maxn],head[maxn];
 14 struct Node
 15 {
 16     int u, v, w;
 17     int next;
 18 }edge[maxm];
 19 void addEdge(int u, int v, int w)
 20 {
 21     edge[idx].u=u;
 22     edge[idx].v=v;
 23     edge[idx].w=w;
 24     edge[idx].next=head[u];
 25     head[u]=idx++;
 26     edge[idx].u=v;
 27     edge[idx].v=u;
 28     edge[idx].w=0;
 29     edge[idx].next=head[v];
 30     head[v]=idx++;
 31 }
 32 int SAP(int s,int e,int n)
 33 {
 34     int max_flow=0,v,u=s;
 35     int id,mindis;
 36     aug[s]=oo;
 37     pre[s]=-1;
 38     memset(dis,0,sizeof(dis));
 39     memset(gap,0,sizeof(gap));
 40     gap[0] = n;
 41     for (int i=0;i<=n;i++)
 42     {
 43         cur[i]=head[i];
 44     }
 45     while(dis[s]<n)
 46     {
 47         bool flag=false;
 48         if(u==e)
 49         {
 50             max_flow+=aug[e];
 51             for (v=pre[e];v!=-1;v=pre[v])
 52             {
 53                 id = cur[v];
 54                 edge[id].w-=aug[e];
 55                 edge[id^1].w+=aug[e];
 56                 aug[v]-=aug[e];
 57                 if (edge[id].w==0)
 58                 u=v;
 59             }
 60         }
 61         for(id=cur[u];id!=-1;id=edge[id].next)
 62         {
 63             v=edge[id].v;
 64             if(edge[id].w>0&&dis[u]==dis[v]+1)
 65             {
 66                 flag=true;
 67                 pre[v]=u;
 68                 cur[u]=id;
 69                 aug[v]=min(aug[u], edge[id].w);
 70                 u=v;
 71                 break;
 72             }
 73         }
 74         if (flag==false)
 75         {
 76             if(--gap[dis[u]]==0)
 77             break;
 78             mindis=n;
 79             cur[u]=head[u];
 80             for(id=head[u];id!=-1;id=edge[id].next)
 81             {
 82                 v=edge[id].v;
 83                 if(edge[id].w>0&&dis[v]<mindis)
 84                 {
 85                     mindis=dis[v];
 86                     cur[u]=id;
 87                 }
 88             }
 89             dis[u]=mindis+1;
 90             gap[dis[u]]++;
 91             if(u!=s)
 92             u=pre[u];
 93         }
 94     }
 95     return max_flow;
 96 }
 97 int main()
 98 {
 99     while(~scanf("%d%d%d",&N,&F,&D))
100     {
101         int source=0,sink=N+N+F+D+10;
102         memset(head,-1,sizeof(head));
103         idx=0;
104         int a,b,f,d;
105         int food [10000];
106         int drink[10000];
107         char str[500][500];
108         for(int i=1;i<=F;i++)
109         {
110             scanf("%d",&food[i]);
111             addEdge(source,i,food[i]);
112         }
113         for(int i=1;i<=D;i++)
114         {
115             scanf("%d",&drink[i]);
116             addEdge(i+F,sink,drink[i]);
117         }
118         for(int i=1;i<=N;i++)
119         {
120             addEdge(D+F+i,D+F+N+i,1);
121         }
122         for(int i=1;i<=N;i++)
123         {
124             scanf("%s",str[i]+1);
125             for(int j=1;j<=F;j++)
126             {
127                 if(str[i][j]=='Y')
128                 {
129                     addEdge(j,F+D+i,1);
130                 }
131             }
132         }
133
134         for(int i=1;i<=N;i++)
135         {
136             scanf("%s",str[i]+1);
137             for(int j=1;j<=D;j++)
138             {
139                 if(str[i][j]=='Y')
140                 {
141                     addEdge(F+D+N+i,F+j,1);
142                 }
143             }
144         }
145         int n=sink+1;
146         printf("%d\n",SAP(source,sink,n));
147     }
148     return 0;
149 }

转载于:https://www.cnblogs.com/pony1993/archive/2012/09/26/2703734.html

HDU 4292 Food (成都赛区网络赛第五题,拆点网络流)相关推荐

  1. hdu 5045 Contest--2014acm上海赛区网络赛

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5045 Contest Time Limit: 2000/1000 MS (Java/Others)   ...

  2. hdu 4278 2012天津赛区网络赛 数学 *

    8进制转为10进制 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include ...

  3. hdu 4738 2013杭州赛区网络赛 桥+重边+连通判断 ***

    题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥,使得这n座岛不连通,求最少要派多少人去. 处理重边 边在遍历的时候,第一个返回的一定是之前去的边,所以 ...

  4. 2014 ACM/ICPC 北京赛区网络赛解题报告汇总

    首页 算法竞赛» 信息聚合 ONLINE JUDGE 书刊杂志 BLOG» 新闻故事» 招聘信息» 投稿须知 2014 ACM/ICPC 北京赛区网络赛解题报告汇总 九月 21st, 2014 | P ...

  5. ZOJ 3810 A Volcanic Island (2014年牡丹江赛区网络赛B题)

    ZOJ 3810 A Volcanic Island (2014年牡丹江赛区网络赛B题) 1.题目描写叙述:点击打开链接 2.解题思路:本题是四色定理的模板题.只是有几种情况要提前特判一下:n==1直 ...

  6. 2011 ACM/ICPC 福州赛区网络赛解题报告

    第一次写网络赛的题解,福州赛区网络赛作为我第一年ACM最后一次网络赛酱油,画了一个很像逗号的句号.....好吧,还得为北京现场赛准备啊准备....... 这次酱油打的很犀利,貌似出第一题很快,之后节奏 ...

  7. 2018ACM-ICPC徐州赛区网络赛: A. Hard to prepare(递推)

    2018ACM-ICPC徐州赛区网络赛: A. Hard to prepare(递推) After Incident, a feast is usually held in Hakurei Shrin ...

  8. 计蒜客 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B coin(求乘法逆元)

    Bob has a not even coin, every time he tosses the coin, the probability that the coin's front face u ...

  9. HDU 5454 Excited Database (2015年沈阳赛区网络赛E题)

    1.题目描述:点击打开链接 2.解题思路:本题利用线段树解决,根据题意,我们需要建立两棵线段树,分别维护主对角线,副对角线.每个线段树的结点需要维护sum,sumL,sumR,其中,sum表示当前区间 ...

最新文章

  1. 阿里资深AI工程师教你逐个击破机器学习核心算法
  2. 有什么类方法或是函数可以查看某个项目的Laravel版本的?
  3. [转载]Lua和C++交互详细总结
  4. linux查看内存、CPU占用资源最多的进程
  5. python中变量作用域
  6. mysql修改密码的注意点
  7. HALCON示例程序stamp_catalogue.hdev分割图片与文字
  8. 【BIM入门实战】Revit入门基础知识选择题带答案解析(116题)
  9. linux网络编程之一般应用采用的协议和不同套接字的地址结构以及用户进程和内核通过哪些函数传递套接字的地址结构
  10. php 分布式 session,浅析PHP分布式中Redis实现Session的方法
  11. redux react-redux入门篇
  12. 工业交换机ERPS环网协议工作原理介绍
  13. 动作捕捉 Motion Capture (Mocap)
  14. php 不报notice错误,PHP新手NOTICE错误常见解决方法_PHP教程
  15. 智能终端代替传统设备 手机APP离线识别车牌号
  16. Cent OS 7 的日常操作
  17. H264 无损压缩及编解码流程
  18. java不足位数补0
  19. mysql qps tps 监控_Mysql库TPS,QPS实时监控脚本
  20. 直线导轨防尘处理方案有哪些?

热门文章

  1. 变量之--列表初始化和结构化绑定
  2. 数组赋值给vector和list,顺便说明int和size_t的区别
  3. Leetcode题库 762.二进制表示中质数个计算置位(哈希数组 C实现)
  4. 党在心中(turtle画图)
  5. python基础入门(Peak带你学python)
  6. [Jarvis OJ - PWN]——[XMAN]level3
  7. fork练习、从进程角度考虑堆区内存申请与释放的有关问题
  8. 英语音标 语言、语音、音素及音标
  9. win10 + Ubuntu18.04 双系统,UEFI+GPT,从win10切换到Ubuntu时黑屏问题
  10. [转] 哈佛大学研究:一个人成为废物的九大根源