题意:N个人,F种食物,D种饮料,给定每种食物和饮料的量。每个人有自己喜欢的食物和饮料,如果得到自己喜欢的食物和饮料才能得到满足。求最大满足的人数。

分析:如果只是简单地N个人选择F种食物的话可以用二分图匹配来完成,但是该题种一个人要选择两样东西。

采取以下操作建图:

  增加源点和汇点,源点与F个食物相连,每条弧流量为第i种食物的数量;D个食物与汇点相连,每条弧流量为其数量。

  所以将N个人拆成两个点,对应两点之间连一条边,流量为1。

然后跑出最大流就是答案。

#include<bits/stdc++.h>
using namespace std;
#define captype int
const int MAXN = ;
const int MAXM = ;
const int INF = <<;
struct EDGE{
int to,next;
captype cap;
} edg[MAXM];
int eid,head[MAXN];
int gap[MAXN];
int dis[MAXN];
int cur[MAXN];
int pre[MAXN]; void init(){
eid=;
memset(head,-,sizeof(head));
}
void AddEdge(int u,int v,captype c,captype rc=){
edg[eid].to=v; edg[eid].next=head[u];
edg[eid].cap=c; head[u]=eid++;
edg[eid].to=u; edg[eid].next=head[v];
edg[eid].cap=rc; head[v]=eid++;
}
captype maxFlow_sap(int sNode,int eNode, int n){//n是包括源点和汇点的总点个数,这个一定要注意
memset(gap,,sizeof(gap));
memset(dis,,sizeof(dis));
memcpy(cur,head,sizeof(head));
pre[sNode] = -;
gap[]=n;
captype ans=;
int u=sNode;
while(dis[sNode]<n){
if(u==eNode){
captype Min=INF ;
int inser;
for(int i=pre[u]; i!=-; i=pre[edg[i^].to])
if(Min>edg[i].cap){
Min=edg[i].cap;
inser=i;
}
for(int i=pre[u]; i!=-; i=pre[edg[i^].to]){
edg[i].cap-=Min;
edg[i^].cap+=Min;
}
ans+=Min;
u=edg[inser^].to;
continue;
}
bool flag = false;
int v;
for(int i=cur[u]; i!=-; i=edg[i].next){
v=edg[i].to;
if(edg[i].cap> && dis[u]==dis[v]+){
flag=true;
cur[u]=pre[v]=i;
break;
}
}
if(flag){
u=v;
continue;
}
int Mind= n;
for(int i=head[u]; i!=-; i=edg[i].next)
if(edg[i].cap> && Mind>dis[edg[i].to]){
Mind=dis[edg[i].to];
cur[u]=i;
}
gap[dis[u]]--;
if(gap[dis[u]]==) return ans;
dis[u]=Mind+;
gap[dis[u]]++;
if(u!=sNode) u=edg[pre[u]^].to; //退一条边
}
return ans;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int S,T,N,M,F,D,u,v,tmp;
while(scanf("%d%d%d",&N,&F,&D)==){
S=,T=*N+F+D+; //源点,汇点
init();
for(int i=;i<=F;++i){
scanf("%d",&tmp);
AddEdge(S,i,tmp);
}
for(int i=;i<=D;++i){
scanf("%d",&tmp);
AddEdge(F+N*+i,T,tmp);
}
for(int i=;i<=N;++i){
AddEdge(i+F,i+F+N,);
char op[MAXN];
scanf("%s",op);
for(int j=;j<=F;++j){
if(op[j-]=='Y') AddEdge(j,i+F,);
}
}
for(int i=;i<=N;++i){
char op[MAXN];
scanf("%s",op);
for(int j=;j<=D;++j){
if(op[j-]=='Y') AddEdge(F+N+i,F+N*+j,);
}
}
printf("%d\n",maxFlow_sap(S,T,T+));
}
return ;
}

  

HDU 4292 Food (拆点最大流)的更多相关文章

  1. Food HDU - 4292 网络流 拆点建图

    http://acm.hdu.edu.cn/showproblem.php?pid=4292 给一些人想要的食物和饮料,和你拥有的数量,问最多多少人可以同时获得一份食物和一份饮料 写的时候一共用了2种 ...

  2. HDU 4292:Food(最大流)

    http://acm.hdu.edu.cn/showproblem.php?pid=4292 题意:和奶牛一题差不多,只不过每种食物可以有多种. 思路:因为食物多种,所以源点和汇点的容量要改下.还有D ...

  3. HDU 4292 Food (网络流,最大流)

    HDU 4292 Food (网络流,最大流) Description You, a part-time dining service worker in your college's dining ...

  4. Control(拆点+最大流)

    Control http://acm.hdu.edu.cn/showproblem.php?pid=4289 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  5. hdu4289 最小割最大流 (拆点最大流)

    最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...

  6. HDU 2098 分拆素数和

    HDU 2098 分拆素数和 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768K (Java/Others) [题目描述 ...

  7. HDU 3549 Flow Problem(最大流)

    HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  8. HDU 2098 分拆素数和(素数)

    HDU 2098 分拆素数和(素数) http://acm.hdu.edu.cn/showproblem.php?pid=2098 题意: 给你一个偶数,问你这个偶数有多少种方式能由两个不同的素数构成 ...

  9. BZOJ 1877 晨跑 拆点费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1877 题目大意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧 ...

随机推荐

  1. js定时器(执行一次、重复执行)

    代码如下: <script> //定时器 异步运行 function hello(){ alert("hello"); } //使用方法名字执行方法 var t1 = ...

  2. C++ 类模板二(类模版与友元函数)

    //类模版与友元函数 #include<iostream> using namespace std; template<typename T> class Complex{ p ...

  3. Using Fast Weights to Attend to the Recent Past

    Ba, Jimmy, et al. "Using Fast Weights to Attend to the Recent Past." Advances In Neural In ...

  4. 要生成一个窗口,通常使用Window的子类Frame类进行实例化

    要生成一个窗口,通常使用Window的子类Frame类进行实例化,而不是直接使用Window 类,框架的外观就像平常Windows系统下的窗口,有标题.边框. 菜单 和大小等. setSize()方法 ...

  5. curl使用例子

    地址:http://phpbook.phpxy.com/34771 参考:http://php.net/manual/zh/function.curl-setopt.php 我们将curl的步骤分为以 ...

  6. js漂亮的弹出层

    1.漂亮的弹出层----artDialog http://aui.github.io/artDialog/ 2.弹出层 ------layer http://sentsin.com/jquery/la ...

  7. WPF数据验证(4)——响应与获取验证错误

    1780 前面的示例中,有关用户接受到错误的唯一指示是在违反规则的文本框周围的红色轮廓.为了提供更多信息,可以处理 Error 事件,但存储或清除错误时会引发该事件,但前提是必须确保已将 Bindin ...

  8. MathType可以编辑带圈乘号吗

    在数学中有很多符号,可能这些符号我们用得上,也有些符号我们很少用,甚至用不上,但是我们用不上,不代表不存在这个符号,也不代表别人用不上,只是各自所涉及到的知识领域不一样而已.而对于加减乘除运算,几乎每 ...

  9. TF-IDF(词频-逆向文件频率)用于文字分类

    SVM分类器:支持向量机Support Vector Machine. 一个普通的SVM就是一条直线,用来完美划分linearly separable的两类.解决线性 要解决非线性需要到高维处理: 核 ...

  10. python3----练习题(弹幕跟随)

    # 导入模块 import requests # 1. 网络请求 2.pip install requests import time # 用于时间控制 import random # 随机模块 产生 ...