题目描述

  农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食。每一头牛只喜欢吃一些食品和饮料而别的一概不吃。虽然他不一定能把所有牛喂饱,他还是想让尽可能多的牛吃到他们喜欢的食品和饮料。

  农夫JOHN做了F (1<=F<=100) 种食品和准备了D(1<=D<=100)种饮料。他有N(1<=N<=100)头牛,现在已经知道他的每头牛是否愿意吃某种食物和喝某种饮料。农夫JOHN想给每一头牛一种食品和一种饮料,使得尽可能多的牛得到喜欢的食物和饮料。

  每一件食物和饮料只能由一头牛来用。例如如果食物2被一头牛吃掉了,没有别的牛能吃食物2。

输入

  第一行: 三个数:N, F和D。

  第2..N+1行:每一行有两个数开始F_i和D_i,分别是第i头牛可以吃的食品数和可以喝的饮料数。接下来下F_i个整数是第i头牛可以吃的食品号,再下面的D_i个整数是第i头牛可以喝的饮料号码。

输出

  文件输出仅一行为一个整数,表示最多可以喂饱牛的数目。

样例输入

4 3 3

2 2 1 2 3 1

2 2 2 3 1 2

2 2 1 3 1 2

2 1 1 3 3

样例输出

3

解法

网络流建模:

源点向每个食物连一条容量为1的边;

每头牛拆成两个点xi,yi,这两个点连一条容量为1的边;

这头牛的喜好食物向xi连一条容量为1的边,yi向喜好饮品连一条容量为1的边;

每个饮品向汇点连一条容量为1的边。


检验:

每头牛只能占用一个饮品和食品,所以把牛拆点。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define sqr(x) ((x)*(x))
#define ln(x,y) int(log(x)/log(y))
#define food(x) (1+x)
#define drink(x) (1+m1+x)
#define cow(x) (1+m1+m2+x)
#define cow1(x) (1+m1+m2+n+x)
using namespace std;
const char* fin="ex1611.in";
const char* fout="ex1611.out";
const int inf=0x7fffffff;
const int maxn=1007,maxm=maxn*10;
int n,m1,m2,i,j,k,ans=0;
int num,tot=1,fi[maxn],ne[maxm],la[maxm],va[maxm];
int bz[maxn],cnt[maxn];
void add_line(int a,int b,int c){
tot++;
ne[tot]=fi[a];
la[tot]=b;
va[tot]=c;
fi[a]=tot;
}
void add(int a,int b,int c){
add_line(a,b,c);
add_line(b,a,0);
}
int gap(int v,int flow){
int i,use=0,k;
if (v==num) return flow;
for (k=fi[v];k;k=ne[k])
if (va[k] && bz[v]==bz[la[k]]+1){
i=gap(la[k],min(va[k],flow-use));
use+=i;
va[k]-=i;
va[k^1]+=i;
if (use==flow || bz[1]==num) return use;
}
if (!--cnt[bz[v]]) bz[1]=num;
cnt[++bz[v]]++;
return use;
}
int main(){
scanf("%d%d%d",&n,&m1,&m2);
num=1+m1+m2+n+n+1;
for (i=1;i<=n;i++){
int iiii;
add(cow(i),cow1(i),1);
scanf("%d",&j);
scanf("%d",&iiii);
for (;j;j--){
scanf("%d",&k);
add(food(k),cow(i),1);
}
for (;iiii;iiii--){
scanf("%d",&k);
add(cow1(i),drink(k),1);
}
}
for (i=1;i<=m1;i++) add(1,food(i),1);
for (i=1;i<=m2;i++) add(drink(i),num,1);
cnt[0]=num;
while (bz[1]<num) ans+=gap(1,inf);
printf("%d",ans);
return 0;
}

启发

通过拆点来限制每头牛的贡献。

【JZOJ1611】Dining的更多相关文章

  1. 【USACO】Dining

    [题目链接] [JZXX]点击打开链接 [caioj]点击打开链接 [算法] 拆点+网络流 [代码] #include<bits/stdc++.h> using namespace std ...

  2. 【BZOJ1226】[SDOI2009]学校食堂Dining 状压DP

    [BZOJ1226][SDOI2009]学校食堂Dining Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满 ...

  3. 【BZOJ】1711: [Usaco2007 Open]Dining吃饭

    [算法]最大流 [题解] S连向食物连向牛连向牛‘连向饮料连向T. 经典的一个元素依赖于两个元素的建图方式. #include<cstdio> #include<algorithm& ...

  4. 【SDOI2009】解题汇总

    又开了波专题,感觉就和炉石开冒险一样...(说的好像我有金币开冒险似的) /---------------------------------------------/ BZOJ-1226 [SDOI ...

  5. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  6. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  7. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  8. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  9. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

随机推荐

  1. Maven实战04_使用Archetype生成项目骨架

    在上一章中的HelloWorld中,我们的项目遵循了一些Maven项目的约定 在项目的根目录中放置pom.xml 在src/main/java目录中放置项目的主代码 在src/test/java目录中 ...

  2. 开方运算的DSP实现

    //=============================================== //函数名:VSqrt3 //功能:  实现对32位定点数的开方 //性能:  60M主频28015 ...

  3. python-基础-面向对象2-异常-模块工厂模式

    1 工厂模式和单例模式 1简单工厂模式 1.1.使用函数实现 # 定义伊兰特车类 class YilanteCar(object): # 定义车的方法 def move(self): print(&q ...

  4. VirtualBox新建虚拟机常用配置

    1.内存给到1G,不然无法进入图形界面进行分区配置及软件包选择.虚拟机存储记得放到D盘. 2.网络选择桥接模式以便SSH,初次登陆后配置/etc/sysconfig/network-scripts/i ...

  5. php匿名函数与闭包函数

    匿名函数:没有名字的函数:并没有牵扯到应用其他函数的变量问题.仅仅是没有名字 $f=function($param){} 闭包:A函数中嵌套着B函数,B程序中有用到A的变量,当外部函数C调用函数A时, ...

  6. MySQL与Oracle差异函数对比

    ORACLE:select round(1.23456,4) value from dual MYSQL:select round(1.23456,4) value 2 abs(-1) abs(-1) ...

  7. 修改代码150万行!与 Blink 合并后的 Apache Flink 1.9.0 究竟有哪些重大变更?

    8月22日,Apache Flink 1.9.0 正式发布,早在今年1月,阿里便宣布将内部过去几年打磨的大数据处理引擎Blink进行开源并向 Apache Flink 贡献代码.当前 Flink 1. ...

  8. TZ_01MyBatis_SqlMapConfig.xml

    1.sqlMapConfig的配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE conf ...

  9. []jnhs]日志套件log4j输出到控制台和文件

    log4j的xml配置文件改为 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j: ...

  10. 常用命令6--文件搜索命令4-grep

    查找不包含size字符串的文件.