给出一些人,一些食物,一些饮料,每个人都只喜欢喝某些饮料,吃某些食品,每个食品和饮料都有一定的数量,现在问最多能满足多少人的需求。

注意理解题意了,每个人只需要要拿一个食物和一个饮料即可,这题目说得好像不是很明显,坑呐。

简单建模。超级源点->食物->人->人'->饮料->超级汇点。除了与源点和汇点的边容量为食物和饮料数量,其他的都为1.

跑最大流,就是答案了。。不多说

召唤代码君:

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1010
#define maxm 2000100
using namespace std; int first[maxn],next[maxm],to[maxm],c[maxm],N;
int d[maxn],tag[maxn],TAG=520;
int s,t,n,F,D,ans,tmp;
char str[maxn][maxn];
int Q[maxn],bot,top;
bool can[maxn]; void _init()
{
s=0,t=F+D+n+n+1,N=-1;
for (int i=s; i<=t; i++) first[i]=-1;
} void addedge(int U,int V,int W)
{
N++;
to[N]=V,c[N]=W,next[N]=first[U],first[U]=N;
N++;
to[N]=U,c[N]=0,next[N]=first[V],first[V]=N;
} void edge_build()
{
for (int i=1; i<=F; i++) scanf("%d",&tmp),addedge(s,i,tmp);
for (int i=1; i<=D; i++) scanf("%d",&tmp),addedge(F+n+n+i,t,tmp);
for (int i=1; i<=n; i++) scanf("%s",str[i]+1);
for (int i=1; i<=n; i++)
for (int j=1; j<=F; j++)
if (str[i][j]=='Y') addedge(j,F+i,1);
for (int i=1; i<=n; i++) scanf("%s",str[i]+1);
for (int i=1; i<=n; i++)
for (int j=1; j<=D; j++)
if (str[i][j]=='Y') addedge(F+n+i,F+n+n+j,1);
for (int i=1; i<=n; i++) addedge(F+i,F+n+i,1);
} bool bfs()
{
TAG++;
Q[bot=top=1]=t,d[t]=0,tag[t]=TAG,can[t]=false;
while (bot<=top)
{
int cur=Q[bot++];
for (int i=first[cur]; i!=-1; i=next[i])
if (c[i^1]>0 && tag[to[i]]!=TAG)
{
tag[to[i]]=TAG,Q[++top]=to[i],d[to[i]]=d[cur]+1,can[to[i]]=false;
if (to[i]==s) return true;
}
}
return false;
} int dfs(int cur,int num)
{
if (cur==t) return num;
int tmp=num,k;
for (int i=first[cur]; i!=-1; i=next[i])
if (c[i]>0 && tag[to[i]]==TAG && d[to[i]]==d[cur]-1 && can[to[i]]==false)
{
k=dfs(to[i],min(num,c[i]));
if (k) num-=k,c[i]-=k,c[i^1]+=k;
if (num==0) break;
}
if (num) can[cur]=true;
return tmp-num;
} int main()
{
while (scanf("%d%d%d",&n,&F,&D)!=EOF)
{
_init();
edge_build();
for (ans=0; bfs(); bfs()) ans+=dfs(s,maxm);
printf("%d\n",ans);
}
return 0;
}

  

HDU4292_Food的更多相关文章

随机推荐

  1. UWP 剪贴板 Clipboard

    Clipboard使用Windows.ApplicationModel.DataTransfer.Clipboard 设置文本 DataPackage dataPackage = new DataPa ...

  2. String与Date的互相转换

    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 也可以: SimpleDateFormat sd ...

  3. Sql-Server 邮件相关的查询和删除

    -- 查询邮件发送记录和报告 SELECT TOP(50) * FROM msdb.dbo.sysmail_allitems ORDER BY mailitem_id DESC SELECT TOP( ...

  4. MapReduce 基础学习

      什么是MapReduce? mapreduce 是一种软件框架 mapreduce job将任务分解为独立的块儿到不同的map task,进行并行处理: map任务输出会做相应的排序处理,并作为r ...

  5. 别再犯低级错误,带你了解更新缓存的四种Desigh Pattern

    在我们使用分布式缓存Redis或者Memcached编写更新缓存数据代码时,我们总是会犯一个逻辑错误.先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中.试想,两个并发操作,一个是更新操 ...

  6. 对React children 的深入理解

    React的核心为组件.你可以像嵌套HTML标签一样嵌套使用这些组件,这使得编写JSX更加容易因为它类似于标记语言. 当我刚开始学习React时,当时我认为“使用 props.children 就这么 ...

  7. mac 上面安装 tree 命令

    相信很多使用过Linux的用户都用过tree命令,它可以像windows的文件管理器一样清楚明了的显示目录结构. 但是mac下默认是没有 tree命令的. 1.我们可以使用find命令模拟出tree命 ...

  8. Final阶段版本控制报告

    版本控制代码及文档要求 在coding.net版本控制; 公开项目,教师.专家.其他同学可以不注册源代码.在此公布git地址. 报告beta阶段2周中,项目的版本控制情况,不包括未在coding.ne ...

  9. 第35次Scrum会议(11/23)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文小组照片 二.开会信息 时间:2017/11/23 17:03~17:24,总计21min.地点:东北师 ...

  10. leetcode 184 部门工资最高的员工

    题目描述:Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id. Department 表包含公司所有部门的信息. 编写一个 SQL 查询,找 ...