正在网络流入门(原来这种题用网络流做)

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

* 第一行: 一个整数,最多可以喂饱的牛数.


题目分析

首先将源点连向所有食物;所有饮料连向汇点。接下来是中间奶牛的部分,容易发现如果简单地食物-奶牛-饮料一连,将会导致一头奶牛可能吃了很多饮料食物。这里有一种巧妙的处理方法:将一头奶牛拆成两个点,中间连一条容量为1的边,意味着一头牛只能占有一个食物/饮料。

话说这题在bzoj为什么会莫名其妙TLE啊……

  1. #include<bits/stdc++.h>
  2. const int maxn = ;
  3. const int maxm = ;
  4. const int INF = 2e9;
  5.  
  6. struct Edge
  7. {
  8. int u,v,f,c;
  9. Edge(int a=, int b=, int c=, int d=):u(a),v(b),f(c),c(d) {}
  10. }edges[maxm];
  11. int n,f,d,S,T,lv[maxn];
  12. int edgeTot,head[maxn],nxt[maxm];
  13.  
  14. int read()
  15. {
  16. char ch = getchar();
  17. int num = , fl = ;
  18. for (; !isdigit(ch); ch = getchar())
  19. if (ch=='-') fl = -;
  20. for (; isdigit(ch); ch = getchar())
  21. num = (num<<)+(num<<)+ch-;
  22. return num*fl;
  23. }
  24. void addedge(int u, int v, int c)
  25. {
  26. edges[edgeTot] = Edge(u, v, , c), nxt[edgeTot] = head[u], head[u] = edgeTot++;
  27. edges[edgeTot] = Edge(v, u, , ), nxt[edgeTot] = head[v], head[v] = edgeTot++;
  28. }
  29. bool buildLevel()
  30. {
  31. memset(lv, , sizeof lv);
  32. std::queue<int> q;
  33. q.push(S), lv[S] = ;
  34. for (int tmp; q.size(); )
  35. {
  36. tmp = q.front(), q.pop();
  37. for (int i=head[tmp]; i!=-; i=nxt[i])
  38. {
  39. int v = edges[i].v;
  40. if (!lv[v]&&edges[i].f < edges[i].c){
  41. lv[v] = lv[tmp]+, q.push(v);
  42. if (v==T) return true;
  43. }
  44. }
  45. }
  46. return false;
  47. }
  48. int fndPath(int x, int lim)
  49. {
  50. if (x==T) return lim;
  51. for (int i=head[x]; i!=-; i=nxt[i])
  52. {
  53. int v = edges[i].v, val;
  54. if (lv[x]+==lv[v]&&edges[i].f < edges[i].c){
  55. if ((val = fndPath(v, std::min(lim, edges[i].c-edges[i].f)))){
  56. edges[i].f += val, edges[i^].f -= val;
  57. return val;
  58. }else lv[v] = -;
  59. }
  60. }
  61. return ;
  62. }
  63. int dinic()
  64. {
  65. int ret = , val;
  66. while (buildLevel())
  67. while ((val = fndPath(S, INF))) ret += val;
  68. return ret;
  69. }
  70. int main()
  71. {
  72. memset(head, -, sizeof head);
  73. n = read(), f = read(), d = read();
  74. S = , T = n*+f+d+;
  75. for (int i=; i<=n; i++)
  76. {
  77. int k1 = read(), k2 = read();
  78. for (; k1; --k1)
  79. addedge(read(), f+i, );
  80. for (; k2; --k2)
  81. addedge(f+i+n, read()+n*+f, );
  82. addedge(f+i, f+i+n, );
  83. }
  84. for (int i=; i<=f; i++) addedge(S, i, );
  85. for (int i=; i<=d; i++) addedge(f+*n+i, T, );
  86. printf("%d\n",dinic());
  87. return ;
  88. }

END

【最大流】bzoj1711: [Usaco2007 Open]Dining吃饭的更多相关文章

  1. Bzoj1711 [Usaco2007 Open]Dining吃饭

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 872  Solved: 459 Description 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食 ...

  2. BZOJ 1711: [Usaco2007 Open]Dining吃饭

    1711: [Usaco2007 Open]Dining吃饭 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 902  Solved: 476[Submit ...

  3. BZOJ1711: [Usaco2007 Open]Dingin吃饭

    1711: [Usaco2007 Open]Dingin吃饭 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 508  Solved: 259[Submit ...

  4. BZOJ 1711:[Usaco2007 Open]Dining吃饭(最大流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1711 [题目大意] 每头牛都有一些喜欢的饮料和食物, 现在有一些食物和饮料,但是每样只 ...

  5. 【最大流】【Dinic】bzoj1711 [Usaco2007 Open]Dingin吃饭

    把牛拆点,互相连1的边. 把牛的食物向牛连边,把牛向牛的饮料连边. 把源点向牛的食物连边,把牛的饮料向汇点连边. 要把牛放在中间,否则会造成一头牛吃了自己的食物后又去喝别的牛的饮料的情况. #incl ...

  6. bzoj 1711 [Usaco2007 Open]Dining吃饭&&poj 3281 Dining

    最大流. 这东西好像叫三分图匹配. 源点向每个食物点连一条容量为1的边. 每个饮料点向汇点连一条容量为1的边. 将每个牛点拆点,食物点向喜欢它的牛的入点连一条容量为1的边,牛的出点向它喜欢的饮料点连一 ...

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

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

  8. BZOJ 1711: [Usaco2007 Open]Dingin吃饭( 最大流 )

    将牛拆成两个点 i 和 i' 并连弧 , S 向每种 food 连边 , 每种 drink 向 T 连边 , 每种 food 向喜欢他的 cow 连边 到 i , 每种 drink 从喜欢它的 cow ...

  9. 1711: [Usaco2007 Open]Dingin吃饭

    1711: [Usaco2007 Open]Dingin吃饭 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 560  Solved: 290[Submit ...

随机推荐

  1. JavaScript进阶 - 第8章 浏览器对象

    第8章 浏览器对象 8-1 window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法:

  2. Opencv级联分类器实现人脸识别

    在本章中,我们将学习如何使用OpenCV使用系统相机捕获帧.org.opencv.videoio包的VideoCapture类包含使用相机捕获视频的类和方法.让我们一步一步学习如何捕捉帧 - 第1步: ...

  3. BZOJ 2288: 【POJ Challenge】生日礼物 堆&&链表

    就是堆+链表,十分像 数据备份 对吧? 把相邻的正数和相邻的负数合并成一整个正数块和负数块,最后只剩一些交替相间的正块与负块了吧? 显然,正块的个数<=m时,全部选走就获得了最大权值,否则我们可 ...

  4. 【poj3764】The xor-longest Path

    The xor-longest Path Description In an edge-weighted tree, the xor-length of a path p is defined as ...

  5. P2152 [SDOI2009]SuperGCD

    传送门 非常显du然liu的一道题 就是求GCD 因为数据范围... 所以要上压位高精+非递归的辗转相减 关于辗转相减: 如果 A是二的倍数,B是二的倍数   那么GCD(A,B)=2 * GCD(A ...

  6. ASM 磁盘组的的scrip

    之前经常用如下方式进行查询:步骤 1 以oracle用户登录系统.步骤 2 执行如下命令改变ORACLE_SID环境变量.$ export ORACLE_SID=+ASM1[1或者2]需要通过ps - ...

  7. Jenkins+Gitlab+Ansible自动化部署(一)

    首先准备实验环境 虚拟机 主机名 IP地址 服务 系统版本 内核版本 Vmware Workstation 14 gitlab.example.com 192.168.244.130 gitlab  ...

  8. 为什么数据库ID不能作为URL中的标识符

    最近公司在进行网站的SEO优化,将所有主要页面的URL统一更改为新的格式,其中重要的一项改变是将所有URL的标识符统一为ID,例如过去我们的一个用户的公共页面URL是这样的 https://www.e ...

  9. 《从0到1学习Flink》—— Data Source 介绍

    前言 Data Sources 是什么呢?就字面意思其实就可以知道:数据来源. Flink 做为一款流式计算框架,它可用来做批处理,即处理静态的数据集.历史的数据集:也可以用来做流处理,即实时的处理些 ...

  10. css3动画:animation

    例: -webkit-animation: myfirst 5s linear 2s infinite alternate; animation: myfirst 5s linear 2s infin ...