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

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

简单建模。超级源点->食物->人->人'->饮料->超级汇点。除了与源点和汇点的边容量为食物和饮料数量,其他的都为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. AvalonEdit验证语法并提示错误

    <UserControl x:Class="WpfTestApp.Xml.XmlEditor" xmlns="http://schemas.microsoft.co ...

  2. 关于dbw 与dbm 的计算

    一分贝(dB)表示单元信号强度的相对差异.其比率的基础对数为10,,如dB = 10 x Log10 (P1/P2). 基础10对数规则: Log10 (AxB) = Log10(A) + Log10 ...

  3. Jmeter接口测试(七)用例数据分离

    之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...

  4. String字符串的方法

    String字符串在Java开发中是我们常用的一种数据类型,同时String字符串也为我们提供了大量的方法.通过一些实例的练习,我们可以对String字符串的方法有一个比较清楚的了解. 有一个字符串S ...

  5. mysql的安装教程-【linux】

    先卸载系统自带的mysql,停止mysql:service mysql stop 1.查找以前是否装有mysql命令:rpm -qa|grep -i mysql可以看到mysql的几个包:qt-mys ...

  6. Oracle扩展包(pipe,alert,job,scheduler)

    --定义包中函数的纯度级别 create or replace package purityTest is type dept_typ is table of dept%rowtype index b ...

  7. Oracle VM VirtualBox 无法卸载 更新 和修复

    好久没更新Oracle VM VirtualBox 突然发现不能更新了 提示要某个msi文件,回想起来好像是被某个清理垃圾的软件清理掉了. 于是根据提示的版本号网上搜了种子又把安装包下载回来 在命令行 ...

  8. iOS静默推送(Silent Remote Notifications)

    此功能是iOS7新增加的功能,允许应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新. 普通推送:收到推送后(有文字有声音),点开通知,进入APP后,才执行-- ...

  9. Scrum Meeting 10.23

    Scrum Meeting No.3 今天所完成的任务仍然停留在学习基础知识上.说实话,由于缺少安卓开发.web开发的经验,我们只能一步步摸索着来. 成员 已完成任务 下一阶段任务 徐越 阅读网上的博 ...

  10. Shell脚本 数据清洗

    需要做的任务是将上图类似的格式的文件进行处理,将年月日小时分别提取出来放到每行的行尾(上图已清洗好) 自己的思路是先用cut命令将每行的年月日小时提取出来,分别给一个变量,然后再循环利用sed命令将年 ...