BZOJ 1711: [Usaco2007 Open]Dining吃饭
1711: [Usaco2007 Open]Dining吃饭
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 902 Solved: 476
[Submit][Status][Discuss]
Description
农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食. 每一头牛只喜欢吃一些食品和饮料而别的一概不吃.虽然他不一定能把所有牛喂饱,他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. 农夫JOHN做了F (1 <= F <= 100) 种食品并准备了D (1 <= D <= 100) 种饮料. 他的N (1 <= N <= 100)头牛都以决定了是否愿意吃某种食物和喝某种饮料. 农夫JOHN想给每一头牛一种食品和一种饮料,使得尽可能多的牛得到喜欢的食物和饮料. 每一件食物和饮料只能由一头牛来用. 例如如果食物2被一头牛吃掉了,没有别的牛能吃食物2.
Input
* 第一行: 三个数: N, F, 和 D
* 第2..N+1行: 每一行由两个数开始F_i 和 D_i, 分别是第i 头牛可以吃的食品数和可以喝的饮料数.下F_i个整数是第i头牛可以吃的食品号,再下面的D_i个整数是第i头牛可以喝的饮料号码.
Output
* 第一行: 一个整数,最多可以喂饱的牛数.
Sample Input
2 2 1 2 3 1
2 2 2 3 1 2
2 2 1 3 1 2
2 1 1 3 3
输入解释:
牛 1: 食品从 {1,2}, 饮料从 {1,2} 中选
牛 2: 食品从 {2,3}, 饮料从 {1,2} 中选
牛 3: 食品从 {1,3}, 饮料从 {1,2} 中选
牛 4: 食品从 {1,3}, 饮料从 {3} 中选
Sample Output
输出解释:
一个方案是:
Cow 1: 不吃
Cow 2: 食品 #2, 饮料 #2
Cow 3: 食品 #1, 饮料 #1
Cow 4: 食品 #3, 饮料 #3
用鸽笼定理可以推出没有更好的解 (一共只有3总食品和饮料).当然,别的数据会更难.
HINT
Source
网络流,拆点建图,每一条流都对应着满足一头牛的方案。和今天考试T1贼像……
- #include <cstdio>
- inline int nextChar(void) {
- const int siz = ;
- static char buf[siz];
- static char *hd = buf + siz;
- static char *tl = buf + siz;
- if (hd == tl)
- fread(hd = buf, , siz, stdin);
- return *hd++;
- }
- inline int nextInt(void) {
- register int ret = ;
- register int neg = false;
- register int bit = nextChar();
- for (; bit < ; bit = nextChar())
- if (bit == '-')neg ^= true;
- for (; bit > ; bit = nextChar())
- ret = ret * + bit - ;
- return neg ? -ret : ret;
- }
- inline int min(int a, int b)
- {
- return a < b ? a : b;
- }
- const int siz = ;
- const int inf = ;
- int tot;
- int s, t;
- int hd[siz];
- int to[siz];
- int fl[siz];
- int nt[siz];
- inline void add(int u, int v, int f)
- {
- nt[tot] = hd[u]; to[tot] = v; fl[tot] = f; hd[u] = tot++;
- nt[tot] = hd[v]; to[tot] = u; fl[tot] = ; hd[v] = tot++;
- }
- int dep[siz];
- inline bool bfs(void)
- {
- static int que[siz], head, tail;
- for (int i = s; i <= t; ++i)dep[i] = ;
- dep[que[head = ] = s] = tail = ;
- while (head != tail)
- {
- int u = que[head++], v;
- for (int i = hd[u]; ~i; i = nt[i])
- if (!dep[v = to[i]] && fl[i])
- dep[que[tail++] = v] = dep[u] + ;
- }
- return dep[t];
- }
- int cur[siz];
- int dfs(int u, int f)
- {
- if (u == t || !f)
- return f;
- int used = , flow, v;
- for (int i = cur[u]; ~i; i = nt[i])
- if (dep[v = to[i]] == dep[u] + && fl[i])
- {
- flow = dfs(v, min(fl[i], f - used));
- used += flow;
- fl[i] -= flow;
- fl[i^] += flow;
- if (used == f)
- return f;
- if (fl[i])
- cur[u] = i;
- }
- if (!used)
- dep[u] = ;
- return used;
- }
- inline int maxFlow(void)
- {
- int maxFlow = , newFlow;
- while (bfs())
- {
- for (int i = s; i <= t; ++i)
- cur[i] = hd[i];
- while (newFlow = dfs(s, inf))
- maxFlow += newFlow;
- }
- return maxFlow;
- }
- int N, F, D;
- inline int cow(int x, int y)
- {
- return F + D + y * N + x;
- }
- inline int food(int x)
- {
- return x;
- }
- inline int drink(int x)
- {
- return x + F;
- }
- signed main(void)
- {
- N = nextInt();
- F = nextInt();
- D = nextInt();
- s = , t = N* + F + D + ;
- for (int i = s; i <= t; ++i)
- hd[i] = -;
- for (int i = ; i <= F; ++i)
- add(s, food(i), );
- for (int i = ; i <= D; ++i)
- add(drink(i), t, );
- for (int i = ; i <= N; ++i)
- {
- int f = nextInt();
- int d = nextInt();
- add(cow(i, ), cow(i, ), );
- for (int j = ; j <= f; ++j)
- add(food(nextInt()), cow(i, ), );
- for (int j = ; j <= d; ++j)
- add(cow(i, ), drink(nextInt()), );
- }
- printf("%d\n", maxFlow());
- }
@Author: YouSiki
BZOJ 1711: [Usaco2007 Open]Dining吃饭的更多相关文章
- bzoj 1711 [Usaco2007 Open]Dining吃饭&&poj 3281 Dining
最大流. 这东西好像叫三分图匹配. 源点向每个食物点连一条容量为1的边. 每个饮料点向汇点连一条容量为1的边. 将每个牛点拆点,食物点向喜欢它的牛的入点连一条容量为1的边,牛的出点向它喜欢的饮料点连一 ...
- BZOJ 1711: [Usaco2007 Open]Dingin吃饭( 最大流 )
将牛拆成两个点 i 和 i' 并连弧 , S 向每种 food 连边 , 每种 drink 向 T 连边 , 每种 food 向喜欢他的 cow 连边 到 i , 每种 drink 从喜欢它的 cow ...
- 【BZOJ】1711: [Usaco2007 Open]Dining吃饭
[算法]最大流 [题解] S连向食物连向牛连向牛‘连向饮料连向T. 经典的一个元素依赖于两个元素的建图方式. #include<cstdio> #include<algorithm& ...
- BZOJ 1711: [Usaco2007 Open]Dingin吃饭
Description 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食. 每一头牛只喜欢吃一些食品和饮料而别的一概不吃.虽然他不一定能把所有牛喂饱,他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. ...
- 1711: [Usaco2007 Open]Dingin吃饭
1711: [Usaco2007 Open]Dingin吃饭 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 560 Solved: 290[Submit ...
- BZOJ 1711:[Usaco2007 Open]Dining吃饭(最大流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1711 [题目大意] 每头牛都有一些喜欢的饮料和食物, 现在有一些食物和饮料,但是每样只 ...
- 【最大流】bzoj1711: [Usaco2007 Open]Dining吃饭
正在网络流入门(原来这种题用网络流做) Description 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食. 每一头牛只喜欢吃一些食品和饮料而别的一概不吃.虽然他不一定能把所有牛喂饱,他还是想 ...
- Bzoj1711 [Usaco2007 Open]Dining吃饭
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 872 Solved: 459 Description 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食 ...
- BZOJ1711: [Usaco2007 Open]Dingin吃饭
1711: [Usaco2007 Open]Dingin吃饭 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 508 Solved: 259[Submit ...
随机推荐
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- Hibernate入门详解
学习Hibernate ,我们首先要知道为什么要学习它?它有什么好处?也就是我们为什么要学习框架技术? 还要知道 什么是Hibernate? 为什么要使用Hibernate? Hib ...
- CSS3新特性应用之字体排印
一.插入换行 ~:表示同辈元素之后指定类型的元素,如;elm1 ~ elm2表示,elm1之后的所有elm2元素,且elm1与elm2都是在同一个父级元素. +:表示同辈元素的兄弟元素. \A:一个空 ...
- webpack+react+antd 单页面应用实例
React框架已经火了好长一段时间了,再不学就out了! 对React还没有了解的同学可以看看我之前的一篇文章,可以快速简单的认识一下React.React入门最好的实例-TodoList 自己从开始 ...
- js sort() reverse()
数组中存在的两个方法:sort()和reverse() 直接用sort(),如下: ,,,,,,,,,,,]; console.log(array.sort());ps:[0, 1, 2, 2, 29 ...
- Android无需申请权限拨打电话
Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data ...
- 好玩的Handler
Android提供了Handler和Looper来满足线程间的通信; Handler和Activity的任务栈不同,它是先进先出原则; Handler:你可以构造Handler对象来与Looper沟通 ...
- luke使用
Luke介绍 Luke是一个方便的索引查看和诊断工具,可以访问Lucene构建的索引文件,显示和修改某些索引内容.能提供: 通过document编号或term浏览索引 查看document内容,可复制 ...
- js异步加载的3种方式(转载)
1.defer标签 只支持IE defer属性的定义和用法: 属性规定是否对脚本执行进行延迟,直到页面加载为止.有的 javascript 脚本 document.write 方法来创建当前的文 ...
- ORA-02020 : 过多的数据库链接在使用中-Windows环境解决步骤
一.现象 编译存储过程时报ORA-02020错误. 错误详细信息:ORA-04052在查找远程对象 xx@yy时出错 ORA-00604 : 递归 SQL 级别 1 出现错误 ORA-02020 : ...