HDU 4292 Food (拆点最大流)
题意: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 (拆点最大流)的更多相关文章
- Food HDU - 4292 网络流 拆点建图
http://acm.hdu.edu.cn/showproblem.php?pid=4292 给一些人想要的食物和饮料,和你拥有的数量,问最多多少人可以同时获得一份食物和一份饮料 写的时候一共用了2种 ...
- HDU 4292:Food(最大流)
http://acm.hdu.edu.cn/showproblem.php?pid=4292 题意:和奶牛一题差不多,只不过每种食物可以有多种. 思路:因为食物多种,所以源点和汇点的容量要改下.还有D ...
- HDU 4292 Food (网络流,最大流)
HDU 4292 Food (网络流,最大流) Description You, a part-time dining service worker in your college's dining ...
- Control(拆点+最大流)
Control http://acm.hdu.edu.cn/showproblem.php?pid=4289 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- hdu4289 最小割最大流 (拆点最大流)
最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...
- HDU 2098 分拆素数和
HDU 2098 分拆素数和 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768K (Java/Others) [题目描述 ...
- HDU 3549 Flow Problem(最大流)
HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- HDU 2098 分拆素数和(素数)
HDU 2098 分拆素数和(素数) http://acm.hdu.edu.cn/showproblem.php?pid=2098 题意: 给你一个偶数,问你这个偶数有多少种方式能由两个不同的素数构成 ...
- BZOJ 1877 晨跑 拆点费用流
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1877 题目大意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧 ...
随机推荐
- 数组有没有length()这个方法?String有没有length()这个方法?
数组有没有length()这个方法?String有没有length()这个方法? 解答:数组没有length()方法 它有length属性 String有length()方法.
- 怎样在xilinx SDK中显示行号
Window→preferences→editor→test editor 对ecilpse的通用方法 打开Eclipse软件,在菜单中选择窗体--首选项.打开新的窗体. 在新的窗体中依次选择常规-- ...
- [翻译]在ASP.NET Web API中通过OData支持查询和分页
OData可以通过形如http://localhost/Products?$orderby=Name这样的QueryString传递查询条件.排序等.你可以在任何Web API Controller中 ...
- ubuntu 自动清理/tmp目录
在Ubuntu系统中,在/tmp文件夹里面的内容,每次开机都会被清空,如果不想让他自动清理的话,只需要更改rcS文件中的TMPTIME的值. 我们看如何来修改 sudo vi /etc/default ...
- (转)Unity笔记之编辑器(CurveField、DoubleField、EnumMaskField、EnumPopup) ... ...
1. CurveField创建的是一个类型为AnimationCurve的曲线变量,看代码: [code]csharpcode: using UnityEngine; using System.Col ...
- MathType编辑钢筋符号就是这么简单
很多的用户在使用MathType公式编辑器的时候,发现它所包含的符号非常的多,几乎你在数学中看到的任何符号都能用MathType编辑出来.它能够满足各个学科对符号的需求,除了常规的数学物理符号之外,也 ...
- [Linux 学习] Centos 图形和命令行界面切换
要想切换图形界面和命令行界面切换, 需修改一个文件... root 下, 到 /etc/inittab 修改 id:5:initdefault Linux系统有7个运行级别(runlevel): 运行 ...
- 把資源加载到内存中 BMP 出错
BMP文件放到VS的資源中時,VS會將BMP的文件頭去掉,即BITMAPFILEHEADER,這個結構體去除.所以當加載BMP到內存中時,如果是使用GDI+或是其它解釋庫時,會解析失敗. 所以在讀取B ...
- 64、具有过渡动画效果的布局Layout( 2 )
[ CoordinatorLayout-与手势完美结合的滑动视图 ] [ AppBarLayout-可以随手势滑动的AppBar ] <android.support.design.widget ...
- javascript 上传文件相关 (5) Blob 对象
这一系列文章都讲述的是关于使用 JavaScript 操作文件相关的知识,其中最重要的是 File 对象,而实际上 file 对象只是 blob 对象的一个更具体的版本,blob 存储着大量的二进制数 ...