裸的最大流。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. const int MAXN = 4e3 + 19, MAXM = 4e6 + 19;
  5. struct Edge{
  6. int to, next, c;
  7. }edge[MAXM];
  8. int cnt = -1, head[MAXN];
  9. inline void add(int from, int to, int c){
  10. edge[++cnt].to = to;
  11. edge[cnt].c = c;
  12. edge[cnt].next = head[from];
  13. head[from] = cnt;
  14. }
  15. int n, f, d;
  16. int dep[MAXN];
  17. int bfs(void){
  18. std::queue<int>q; q.push(0);
  19. std::memset(dep, 0, sizeof dep); dep[0] = 1;
  20. while(!q.empty()){
  21. int node = q.front(); q.pop();
  22. for(int i = head[node]; i != -1; i = edge[i].next)
  23. if(!dep[edge[i].to] && edge[i].c)
  24. dep[edge[i].to] = dep[node] + 1, q.push(edge[i].to);
  25. }
  26. return dep[f + n + n + d + 1];
  27. }
  28. inline int min(const int& a, const int& b){
  29. return a < b ? a : b;
  30. }
  31. int dfs(int node, int flow){
  32. if(node == f + n + n + d + 1 || !flow)
  33. return flow;
  34. int stream = 0, f;
  35. for(int i = head[node]; i != -1; i = edge[i].next)
  36. if(dep[edge[i].to] == dep[node] + 1 && (f = dfs(edge[i].to, min(flow, edge[i].c)))){
  37. flow -= f, stream += f;
  38. edge[i].c -= f, edge[i ^ 1].c += f;
  39. if(!flow)
  40. break;
  41. }
  42. return stream;
  43. }
  44. int dinic(void){
  45. int flow = 0;
  46. while(bfs())
  47. flow += dfs(0, 0x3f3f3f3f);
  48. return flow;
  49. }
  50. int main(){
  51. std::memset(head, -1, sizeof head);
  52. std::scanf("%d%d%d", &n, &f, &d);
  53. for(int i = 1; i <= f; ++i)
  54. add(0, i, 1), add(i, 0, 0);
  55. for(int i = f + 1; i <= f + n; ++i)
  56. add(i, i + n, 1), add(i + n, i, 0);
  57. for(int i = f + n + n + 1; i <= f + n + n + d; ++i)
  58. add(i, f + n + n + d + 1, 1), add(f + n + n + d + 1, i, 0);
  59. for(int a, b, i = 1; i <= n; ++i){
  60. int l;
  61. std::scanf("%d%d", &a, &b);
  62. while(a--){
  63. std::scanf("%d", &l);
  64. add(l, f + i, 1), add(f + i, l, 0);
  65. }
  66. while(b--){
  67. std::scanf("%d", &l);
  68. add(f + n + i, f + n + n + l, 1), add(f + n + n + l, f + n + i, 0);
  69. }
  70. }
  71. std::printf("%d\n", dinic());
  72. return 0;
  73. }

洛谷 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(最大流+拆点)

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

  3. P2891 [USACO07OPEN]吃饭Dining

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

  4. P2891 [USACO07OPEN]吃饭Dining 最大流

    \(\color{#0066ff}{ 题目描述 }\) 有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有n头牛,每头牛都有自己喜欢的食物种类列表和饮料种类 ...

  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. 洛谷P2891 Dining P1402 酒店之王【类二分图匹配】题解+代码

    洛谷P2891 Dining P1402 酒店之王[类二分图匹配]题解+代码 酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的 ...

  8. 2018.06.29 洛谷P2890 [USACO07OPEN]便宜的回文(简单dp)

    P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome 时空限制 1000ms / 128MB 题目描述 Keeping track of all the cows c ...

  9. [USACO07OPEN]吃饭Dining

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

随机推荐

  1. ZooKeeper-集群模式配置

    (1)下载安装zookeeper,进行基本的配置,详细教程:https://www.cnblogs.com/excellencesy/p/11956485.html (2)在三台虚拟机上分别按照以上方 ...

  2. Laravel Vuejs 实战:开发知乎 (2)用户登录

    1.安装一个给用户提示的扩展包: 二选一: https://github.com/laracasts/flash [我选的这个]https://github.com/oanhnn/laravel-fl ...

  3. java8中的常用日期操作

    java8有很多时间上的新api,在操作时间的时候很好用,这儿算是个备忘录吧,(补充中...) 定位某个时间:of方法 LocalDateTime dateTime = LocalDateTime.o ...

  4. java泛型demo

    1.泛型类 public class Dog<T> { private T age; public Dog(T age) { this.age = age; } public T getA ...

  5. 5_6 团体队列(UVa540)<queue与STL其他容器的综合运用>

    先给出T个团体,并给出每个团体有多少人和每个人的编号,然后所有团体一起排队,排成一条大队列,排队的原则是,一个成员加入,如果这个成员所在的团体已经有人在排队了,那么他就加到他所在团体的最后面,而不是整 ...

  6. Linux : file命令

    file xxx file命令用来探测给定文件的类型.file命令对文件的检查分为文件系统.魔法幻数检查和语言检查3个过程 命令选项: -b:列出辨识结果时,不显示文件名称: -c:详细显示指令执行过 ...

  7. 【代码学习】PYTHON 函数

    一.定义函数 def 函数名(): 代码 二.函数调用 #定义函数 def printme(str): print str return #调用函数 printme("SQYY1" ...

  8. UVA315 Network

    割点的概念:对于无向图,删除这个点与其相连的边,整个图的连通分量个数增加. 对于无向图的tarjan算法,必须要设前驱~ 求割点的模板~ #include<cstdio> #include ...

  9. 27 JavaScript的引入&注释&弹窗&变量常量&数据类型及转换&内存&垃圾回收

    JS的引入: 1 内部引入 绑定元素事件如onclick="" 绑定锚点如href="JavaScript:void(0)" script标签引入,注意:如果标 ...

  10. 科幻电影免费百度云分享(Scince-fiction cloud share)

    Marvel episode Link  Passcode:6h9k Star War full episode Link Passcode:7abk Men In Black Episode Col ...