题意:

  农夫约翰为他的牛准备了F种食物和D种饮料。每头牛都有各自喜欢的食物和饮料,而每种食物或饮料只能分配给一头牛。最多能有多少头牛可以同时得到各自喜欢的食物和饮料?

思路:

  用 s -> 食物 -> 牛 -> 牛 -> 饮料 -> t 为路径,建图。然后跑最大流。

p.ps.: 抄的书上的思路和dfs增广路的模板,当做学习网络流的第一步吧 :)

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. const int MAXV = ;
  8. const int INF = 0x7fffffff;
  9.  
  10. struct edge {
  11. int to; //边的终点
  12. int cap; //容量
  13. int rev; //反向边的编号
  14. };
  15.  
  16. vector<edge> G[MAXV]; //图的邻接表表示
  17. bool used[MAXV]; //DFS中用到的访问标记
  18.  
  19. //向图中增加一条从s到t容量为cap的边
  20. void addEdge(int from, int to, int cap) {
  21. G[from].push_back((edge){to, cap, G[to].size()});
  22. G[to].push_back((edge){from, , G[from].size()-});
  23. }
  24.  
  25. //dfs找增广路
  26. int dfs(int v, int t, int f) {
  27. if (v==t) return f;
  28.  
  29. used[v] = true;
  30. for (int i = ; i < G[v].size(); i++) {
  31. edge &e = G[v][i];
  32. if (!used[e.to] && e.cap>) {
  33. int d = dfs(e.to, t, min(f, e.cap));
  34. if (d>) { //如果找到一条可行路
  35. e.cap -= d; //容量减少
  36. G[e.to][e.rev].cap += d; //反向边容量增加
  37. return d; //找到一条可行路就返回
  38. }
  39. }
  40. }
  41. return ;
  42. }
  43.  
  44. //求解从s到t的最大流
  45. int maxFlow(int s, int t) {
  46. int flow = ;
  47. int f = -;
  48. while (f!=) {
  49. memset(used, false, sizeof(used));
  50. f = dfs(s, t, INF);
  51. flow += f;
  52. }
  53. return flow;
  54. }
  55.  
  56. const int MAXN = ;
  57.  
  58. int N, F, D;
  59. bool likeF[MAXN][MAXN];
  60. bool likeD[MAXN][MAXN];
  61.  
  62. void input() {
  63. memset(likeF, false, sizeof(likeF));
  64. memset(likeD, false, sizeof(likeD));
  65. scanf("%d%d%d", &N, &F, &D);
  66. for (int i = ; i < N; i++) {
  67. int f, d, t;
  68. scanf("%d%d", &f, &d);
  69. for (int j = ; j < f; j++) {
  70. scanf("%d", &t);
  71. likeF[i][t-] = true;
  72. }
  73. for (int j = ; j < d; j++) {
  74. scanf("%d", &t);
  75. likeD[i][t-] = true;
  76. }
  77. }
  78. }
  79.  
  80. void solve() {
  81. //0~N-1: 食物一侧的牛
  82. //N~2N-1: 饮料一侧的牛
  83. //2N~2N+F-1: 食物
  84. //2N+F~2N+F+D: 饮料
  85. int s = N*+F+D, t = s+;
  86.  
  87. //在s与食物之间连边
  88. for (int i = ; i < F; i++) {
  89. addEdge(s, N*+i, );
  90. }
  91.  
  92. //在饮料和t之间连边
  93. for (int i = ; i < D; i++) {
  94. addEdge(N*+F+i, t, );
  95. }
  96.  
  97. for (int i = ; i < N; i++) {
  98. //在两头牛之间连边
  99. addEdge(i, N+i, );
  100.  
  101. //食物到牛
  102. for (int j = ; j < F; j++) if (likeF[i][j]) {
  103. addEdge(N*+j, i, );
  104. }
  105. //牛到饮料
  106. for (int j = ; j < D; j++) if (likeD[i][j]) {
  107. addEdge(N+i, N*+F+j, );
  108. }
  109. }
  110. printf("%d\n", maxFlow(s, t));
  111. }
  112.  
  113. int main() {
  114. #ifdef Phantom01
  115. freopen("PKU3281.txt", "r", stdin);
  116. #endif // Phantom01
  117.  
  118. input();
  119. solve();
  120.  
  121. return ;
  122. }

PKU3281

PKU 3281 Dining 网络流 (抄模板)的更多相关文章

  1. poj 3281 Dining 网络流-最大流-建图的题

    题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...

  2. POJ 3281 Dining 网络流最大流

    B - DiningTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.ac ...

  3. POJ 3281 Dining (网络流之最大流)

    题意:农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 100) 种饮料.每头牛都有各自喜欢的食物和饮料, 而每种食物或饮料只能分配给 ...

  4. POJ 3281 Dining[网络流]

    Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...

  5. POJ 3281 Dining (网络流构图)

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

  6. POJ 3281 Dining(网络流-拆点)

    Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...

  7. POJ 3281 Dining (网络流)

    POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...

  8. 网络流——SAP模板

    //网络流SAP模板,复杂度O(N^2*M) //使用前调用init(源点,汇点,图中点的个数),然后调用add_edge()加边 //调用getflow得出最大流 #define N 55 #def ...

  9. POJ 3281 Dining(最大流)

    POJ 3281 Dining id=3281" target="_blank" style="">题目链接 题意:n个牛.每一个牛有一些喜欢的 ...

随机推荐

  1. STM8S汇编代码分析

    转载:http://blog.csdn.net/u010093140/article/details/50021897使用STVD建立完汇编工程项目之后(具本建立方法可以看我的另一篇博文http:// ...

  2. Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]

    ------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...

  3. JVM内存管理简单剖析

    Java是一个跨平台语言,屏蔽操作系统的差异,无需关心复杂内存管理,做到编写一次到处运行.其强大的能力源于Java Virtual Machine (虚拟机)默默的付出.代码运行在虚拟机之上,虚拟机运 ...

  4. 安装 glusterfs yum源报错

    yum install glusterfs-server yum 一直报错 把/etc/yum.repos.d 备份 删除了所有文件,从测试机192..168.59.128上同步过来 一直报错 已加载 ...

  5. Redis加入Centos Linux开机启动

    Redis加入Centos Linux开机启动 网上有很多redis在linux下自动启动的例子,实现的方式很多,很多都是参考一个老外流传出来启动的例子,其实直接使用是不行,而且有很多地方有一些语法错 ...

  6. 赵雅智:android教学大纲

    带下划线为详细内容链接地址.点击后可跳转.希望给大家尽一些微薄之力.眼下还在整理中 教学章节 教学内容 学时安排 备注 1 Android高速入门 2 Android模拟器与常见命令 3 Androi ...

  7. 38.angular的scope作用域

    转自:https://www.cnblogs.com/best/tag/Angular/ 1. Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. S ...

  8. django 笔记13 CSRF

    CSRF a. CSRF原理 b. 无CSRF时存在隐患 c. Form提交(CSRF) d. Ajax提交(CSRF) CSRF请求头 x-CSRFToken HTTP_X_CSRFToken dj ...

  9. BZOJ 3931 Dijkstra+网络流

    思路: (我能说按照题意模拟么) 用long long inf 要开大--. //By SiriusRen #include <queue> #include <cstdio> ...

  10. MetaSploit攻击实例讲解------Metasploit自动化攻击(包括kali linux 2016.2(rolling) 和 BT5)

    不多说,直接上干货! 前期博客 Kali linux 2016.2(Rolling)里Metasploit连接(包括默认和自定义)的PostgreSQL数据库 Kali linux 2016.2(Ro ...