题目链接

把“时间粒子”作为最大流的计算结果

设置超级源点为 0

顾客点范围为 1 - 204

时间点 205 - 610

超级汇点 615

超级源点与所有顾客连线,容量为需求的烤肉数 * 需求的每块烤肉的时间(即此顾客需要占用的总时间粒子)

顾客与时间点进行连线,仅当此时间点在顾客等待的时间段内,容量为INF

每个时间点与汇点连线,容量为 m

  1. // #include <cstdio>
  2. // #include <cstdlib>
  3. // #include <cmath>
  4. // #include <cstring>
  5. // #include <iostream>
  6. // #include <algorithm>
  7. // #include <string>
  8. // #include <vector>
  9. // #include <queue>
  10. // #include <stack>
  11. // #include <maps>
  12. // #include <list>
  13. #include <bits/stdc++.h>
  14. using namespace std;
  15. /*
  16. * 最大流 SAP 算法,用 GAP 优化后
  17. * 先把流量限制赋值到 maps 数组
  18. * 然后调用 SAP 函数求解
  19. * 可选:导出路径
  20. */
  21. #define MAXN 620
  22. int maps[MAXN][MAXN]; // 存图
  23. int pre[MAXN]; // 记录当前点的前驱
  24. int level[MAXN]; // 记录距离标号
  25. int gap[MAXN]; // gap常数优化
  26. // vector<int> roads[MAXN]; // 导出的路径(逆序)
  27. // int curRoads; // 导出的路径数
  28. // 入口参数vs源点,vt汇点
  29. int SAP(int vs, int vt)
  30. {
  31. memset(pre, -1, sizeof(pre));
  32. memset(level, 0, sizeof(level));
  33. memset(gap, 0, sizeof(gap));
  34. gap[0] = vt;
  35. int v, u = pre[vs] = vs, maxflow = 0, aug = INT_MAX;
  36. // curRoads = 0;
  37. while (level[vs] < vt)
  38. {
  39. // 寻找可行弧
  40. for (v = 1; v <= vt; v++)
  41. {
  42. if (maps[u][v] > 0 && level[u] == level[v] + 1)
  43. {
  44. break;
  45. }
  46. }
  47. if (v <= vt)
  48. {
  49. pre[v] = u;
  50. u = v;
  51. if (v == vt)
  52. {
  53. // int neck = 0; // Dnic 多路增广优化,下次增广时,从瓶颈边(后面)开始
  54. aug = INT_MAX;
  55. // 寻找当前找到的一条路径上的最大流 (瓶颈边)
  56. for (int i = v; i != vs; i = pre[i])
  57. {
  58. // roads[curRoads].push_back(i); // 导出路径——可选
  59. if (aug > maps[pre[i]][i])
  60. {
  61. aug = maps[pre[i]][i];
  62. // neck = i; // Dnic 多路增广优化,下次增广时,从瓶颈边(后面)开始
  63. }
  64. }
  65. // roads[curRoads++].push_back(vs); // 导出路径——可选
  66. maxflow += aug;
  67. // 更新残留网络
  68. for (int i = v; i != vs; i = pre[i])
  69. {
  70. maps[pre[i]][i] -= aug;
  71. maps[i][pre[i]] += aug;
  72. }
  73. // 从源点开始继续搜
  74. u = vs;
  75. // u = neck; // Dnic 多路增广优化,下次增广时,从瓶颈边(后面)开始
  76. }
  77. }
  78. else
  79. {
  80. // 找不到可行弧
  81. int minlevel = vt;
  82. // 寻找与当前点相连接的点中最小的距离标号
  83. for (v = 1; v <= vt; v++)
  84. {
  85. if (maps[u][v] > 0 && minlevel > level[v])
  86. {
  87. minlevel = level[v];
  88. }
  89. }
  90. gap[level[u]]--; // (更新gap数组)当前标号的数目减1;
  91. if (gap[level[u]] == 0)
  92. break; // 出现断层
  93. level[u] = minlevel + 1;
  94. gap[level[u]]++;
  95. u = pre[u];
  96. }
  97. }
  98. return maxflow;
  99. }
  100. // 超级源点 0
  101. // 顾客点 1 - 204
  102. // 时间点 205 - 610
  103. // 超级汇点 615
  104. int n, m;
  105. const int MaxPeople = 210;
  106. const int Ed = 615;
  107. struct costman
  108. {
  109. int b, e, need, time;
  110. };
  111. set<int> timelist;
  112. costman costmanlist[MaxPeople];
  113. void init()
  114. {
  115. memset(maps, 0, sizeof(maps));
  116. set<int>::iterator iterl = timelist.begin();
  117. set<int>::iterator iterr = timelist.begin();
  118. iterr++;
  119. int curiter = 0;
  120. for (size_t i = 0; i < n; i++)
  121. {
  122. maps[0][i + 1] = costmanlist[i].need * costmanlist[i].time;
  123. }
  124. while (iterr != timelist.end())
  125. {
  126. maps[205 + curiter][Ed] = ((*iterr) - (*iterl)) * m;
  127. for (size_t i = 0; i < n; i++)
  128. {
  129. if (costmanlist[i].b <= *iterl && costmanlist[i].e >= *iterr)
  130. {
  131. maps[i + 1][curiter + 205] = INT_MAX;
  132. }
  133. }
  134. iterl++;
  135. iterr++;
  136. curiter++;
  137. }
  138. }
  139. int main()
  140. {
  141. #ifdef ACM_LOCAL
  142. freopen("./in.txt", "r", stdin);
  143. freopen("./out.txt", "w", stdout);
  144. #endif
  145. ios::sync_with_stdio(false);
  146. while (cin >> n >> m)
  147. {
  148. timelist.clear();
  149. long long sum = 0;
  150. for (size_t i = 0; i < n; i++)
  151. {
  152. cin >> costmanlist[i].b >> costmanlist[i].need >> costmanlist[i].e >> costmanlist[i].time;
  153. sum += costmanlist[i].need * costmanlist[i].time;
  154. timelist.insert(costmanlist[i].b);
  155. timelist.insert(costmanlist[i].e);
  156. }
  157. init();
  158. cout << (sum == SAP(0, Ed) ? "Yes" : "No") << endl;
  159. }
  160. return 0;
  161. }

【HDU2883】kebab——最大流的更多相关文章

  1. HDU2883 kebab(最大流判断满流 + 离散化 + 区间化点)

    [题意]: 有一个烤箱,烤箱在一个时刻最多考M个肉串,N个顾客,每个顾客有属性s,n,e,t s是来的时间,n是想要的肉串数量,e是最晚离开的时间,t是烤的时间(几分熟). 顾客的烤肉可以分开烤,比如 ...

  2. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  3. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  4. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  5. HDU图论题单

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  6. 【最大流】【HDU2883】【kebab】

    题意: 有一个烧烤机,每次最多能烤 m 块肉,现在有 n 个人来买烤肉,每个人到达时间为 si,离开时间为 ei,点的烤肉数量为 ci,点的烤肉所需烘烤时间为 di, 每个人要烤的肉可以分成若干份在同 ...

  7. HDU 2883 kebab(最大流)

    HDU 2883 kebab 题目链接 题意:有一个烧烤机,每次最多能烤 m 块肉.如今有 n 个人来买烤肉,每一个人到达时间为 si.离开时间为 ei,点的烤肉数量为 ci,每一个烤肉所需烘烤时间为 ...

  8. F - kebab HDU - 2883 (最大流构图)

    Almost everyone likes kebabs nowadays (Here a kebab means pieces of meat grilled on a long thin stic ...

  9. 图论--网络流--最大流 HDU 2883 kebab(离散化)

    Problem Description Almost everyone likes kebabs nowadays (Here a kebab means pieces of meat grilled ...

随机推荐

  1. mysqldump: Got error: 1449: The user specified as a definer ('user'@'%') does not exist when using LOCK TABLES

    报错:一个库用mysqldump -u -p --opt --force -e --max_allowed_packet= --net_buffer_length= --databases备份时报错如 ...

  2. github hexo配置踩过的坑

    大体步骤:配置npm,在github中增加自己的sshkey. 多sshkey的话在用户主目录的.ssh中要配置好. 删除仓库里面 source/_posts/我的文章.md 执行下面命令更新博客 h ...

  3. 在Docker中运行gocd

    gocd是一个持续集成的工具,可视化效果非常好 运行gocd-server 12345 docker run -d --name server -p8153:8153 -p8154:8154 -v / ...

  4. 达拉草201771010105《面向对象程序设计(java)》第七周学习总结

    达拉草201771010105<面向对象程序设计(java)>第七周学习总结 实验七继承附加实验 实验时间 2018-10-11 1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符 ...

  5. (Win10)Java,Maven,Tomcat8.0,Mysql8.0.15安装与环境配置,以及IDEA2019.3使用JDBC连接MySQL、创建JavaEE项目

    之前用windows+linux的双系统,最近不怎么舒服就把双系统给卸了,没想到除了问题,导致有linux残余,于是就一狠心重装了电脑,又把Java及其相关的一些东西重新装了回来,还好当初存了网盘链接 ...

  6. springcloud gateway整合sentinel

    1.引入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  7. ES6的原始类型数据——Symbol

    javascript中原始值,即基本数据类型,像Number,String,Boolean,undefined,Null都是基本类型值,保存在栈中,但是有个疑问: Symbol打印出来明明是个函数,具 ...

  8. 02 VMware下载与安装

    一.虚拟机的下载 1.进入官方网站 vmware Workstation 官方网站: https://www.vmware.com/cn.html 2.根据操作系统选择合适的产品,在这里以Window ...

  9. Java原来还可以这么学:如何搞定面试中必考的集合类

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  10. 黑科技神器-uTools

    Hello,各位小伙伴们好,又到周末了,小黑哥给大家分享一款神器:『utools』. 官网地址:https://u.tools/ uTools 是一个极简.插件化.跨平台的现代桌面软件.通过自由选配丰 ...