\(\color{#0066ff}{ 题目描述 }\)

有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料。现在有n头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢的食物和饮料。(1 <= f <= 100, 1 <= d <= 100, 1 <= n <= 100)

$\color{#0066ff}{ 输入格式 } $

Line 1: Three space-separated integers: N, F, and D

Lines 2..N+1: Each line i starts with a two integers Fi and Di, the number of dishes that cow i likes and the number of drinks that cow i likes. The next Fi integers denote the dishes that cow i will eat, and the Di integers following that denote the drinks that cow i will drink.

\(\color{#0066ff}{输出格式}\)

Line 1: A single integer that is the maximum number of cows that can be fed both food and drink that conform to their wishes

\(\color{#0066ff}{输入样例}\)

  1. 4 3 3
  2. 2 2 1 2 3 1
  3. 2 2 2 3 1 2
  4. 2 2 1 3 1 2
  5. 2 1 1 3 3

\(\color{#0066ff}{输出样例}\)

  1. 3

\(\color{#0066ff}{数据范围与提示}\)

1 <= f <= 100, 1 <= d <= 100, 1 <= n <= 100

\(\color{#0066ff}{ 题解 }\)

最大流

图从左至右依次为s,食物,牛,牛,饮料,t

s向所有食物连容量为1的边,所有饮料向t连容量为1的边

每头牛之间连容量为1的边

然后食物与左边的牛,右边的牛与饮料,按照输入连容量为1的边

这样保证了题目的两个条件

因为可能会有一头牛同时喜欢多种食物和饮料,而我们只能算一次,一头牛最多有1的流量!

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. LL in() {
  4. char ch; LL x = 0, f = 1;
  5. while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
  6. for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
  7. return x * f;
  8. }
  9. const int maxn = 1e4;
  10. struct node {
  11. int to, dis;
  12. node *nxt, *rev;
  13. node(int to = 0, int dis = 0, node *nxt = NULL, node *rev = NULL)
  14. : to(to), dis(dis), nxt(nxt), rev(rev) {}
  15. void *operator new(size_t) {
  16. static node *S = NULL, *T = NULL;
  17. return (S == T) && (T = (S = new node[1024]) + 1024), S++;
  18. }
  19. }*head[maxn], *cur[maxn];
  20. int dep[maxn];
  21. int n, s, t, na, nb;
  22. void add(int from, int to, int dis) {
  23. head[from] = new node(to, dis, head[from], NULL);
  24. }
  25. void link(int from, int to, int dis) {
  26. add(from, to, dis), add(to, from, 0);
  27. (head[from]->rev = head[to])->rev = head[from];
  28. }
  29. bool bfs() {
  30. for(int i = s; i <= t; i++) dep[i] = 0, cur[i] = head[i];
  31. std::queue<int> q;
  32. q.push(s);
  33. dep[s] = 1;
  34. while(!q.empty()) {
  35. int tp = q.front(); q.pop();
  36. for(node *i = head[tp]; i; i = i->nxt)
  37. if(!dep[i->to] && i->dis)
  38. dep[i->to] = dep[tp] + 1, q.push(i->to);
  39. }
  40. return dep[t];
  41. }
  42. int dfs(int x, int change) {
  43. if(x == t || !change) return change;
  44. int flow = 0, ls;
  45. for(node *i = cur[x]; i; i = i->nxt) {
  46. cur[x] = i;
  47. if(dep[i->to] == dep[x] + 1 && (ls = dfs(i->to, std::min(change, i->dis)))) {
  48. change -= ls;
  49. flow += ls;
  50. i->dis -= ls;
  51. i->rev->dis += ls;
  52. if(!change) break;
  53. }
  54. }
  55. return flow;
  56. }
  57. int dinic() {
  58. int flow = 0;
  59. while(bfs()) flow += dfs(s, 0x7fffffff);
  60. return flow;
  61. }
  62. //na n n nb
  63. int main() {
  64. n = in(), na = in(), nb = in();
  65. s = 0, t = n + n + na + nb + 1;
  66. for(int i = 1; i <= na; i++) link(s, i, 1);
  67. for(int i = 1; i <= nb; i++) link(n + na + n + i, t, 1);
  68. for(int i = 1; i <= n; i++) link(na + i, na + n + i, 1);
  69. for(int i = 1; i <= n; i++) {
  70. int ka = in(), kb = in();
  71. while(ka --> 0) link(in(), na + i, 1);
  72. while(kb --> 0) link(na + n + i, n + n + na + in(), 1);
  73. }
  74. printf("%d\n", dinic());
  75. return 0;
  76. }

P2891 [USACO07OPEN]吃饭Dining 最大流的更多相关文章

  1. P2891 [USACO07OPEN]吃饭Dining(最大流+拆点)

    题目描述 Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she w ...

  2. P2891 [USACO07OPEN]吃饭Dining

    漂亮小姐姐点击就送:https://www.luogu.org/problemnew/show/P2891 题目描述 Cows are such finicky eaters. Each cow ha ...

  3. 洛谷 P2891 [USACO07OPEN]吃饭Dining

    裸的最大流. #include <cstdio> #include <cstring> #include <queue> const int MAXN = 4e3 ...

  4. 洛谷P2891 [USACO07OPEN]吃饭Dining

    题目描述 Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she w ...

  5. 「洛谷P2891」[USACO07OPEN]吃饭Dining 解题报告

    P2891 [USACO07OPEN]吃饭Dining 题目描述 Cows are such finicky eaters. Each cow has a preference for certain ...

  6. [Luogu P2891/POJ 3281/USACO07OPEN ]吃饭Dining

    传送门:https://www.luogu.org/problemnew/show/P2891 题面 \ Solution 网络流 先引用一句真理:网络流最重要的就是建模 今天这道题让我深有体会 首先 ...

  7. bzoj1711[USACO07OPEN]吃饭Dining

    题意 有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有n头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢的食物和饮 ...

  8. [USACO07OPEN]吃饭Dining

    嘟嘟嘟 这应该是网络流入门题之一了,跟教辅的组成这道题很像. 把每一只牛看成书,然后对牛拆点,因为每一只牛只要一份,食物和饮料分别看成练习册和答案. #include<cstdio> #i ...

  9. BZOJ 1711 吃饭dining/Luogu P1402 酒店之王 拆点+最大流流匹配

    题意: (吃饭dining)有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有n头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享 ...

随机推荐

  1. 用nfs挂载内核时出错 ERROR: Cannot umount的解决办法

    SMDK2440 # nfs 30000000 192.168.1.106:/work/nfs_root/uImage                         ERROR: resetting ...

  2. 如何通过outline为SQL语句指定执行计划

    创建测试表 以用户jyu连接,创建测试表 SQL> conn jyu/jyu; Connected. SQL> create table t (id number, name varcha ...

  3. 设置mysql表名大小写不敏感

    在跨平台的程序设计中要注意到mysql的一些系统变量在windows和linux上的缺省值是不同的, 比如mysql表名称的大小写变量. 在windows上lower_case_table_names ...

  4. ORACLE——日期时间格式化参数详解 之三

    2.20 Y,YYY 返回有逗号分隔显示的年 SQL> select to_char(SYSTIMESTAMP,'Y,YYY') from dual; TO_CHAR(SYSTIMESTAMP, ...

  5. 【Android 多媒体应用】使用 TTS

    import java.util.Locale; import android.app.Activity; import android.os.Bundle; import android.speec ...

  6. LINUX 使用DBCA创建ORACLE数据库

  7. Mysql学习—查看表结构、修改和删除数据表

    原文出自:http://blog.csdn.net/junjieguo/article/details/7668775 查看表结构 查看表结构可以用语句DESCRIBE或SHOW CREATE TAB ...

  8. php判断终端是手机还是电脑访问网站代码

    ?php function check_wap() { if (isset($_SERVER['HTTP_VIA'])) return true; if (isset($_SERVER['HTTP_X ...

  9. SQL server2008无法收缩日志

    SQL server2008无法收缩日志,错误信息为: 1:由于最小日志空间要求,无法收缩日志文件 2:无法收缩日志文件 2 (XXX_log),因为该文件结尾的逻辑日志文件正在使用 描述: 用的是网 ...

  10. iOS 打包生成ipa文件(使用终端命令打包)

    1. 打开终端 2.在终端输入cd +空格 把工程文件直接拖到终端,然后回车 3. 在终端输入xcodebuild,回车 然后你可以发现工程文件里多了一个build文件夹 在build文件夹中,有一个 ...