Task Schedule

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 4003    Accepted Submission(s): 1347
Problem Description
Our geometry princess XMM has stoped her study in computational geometry to concentrate on her newly opened factory. Her factory has introduced M new machines in order to process the coming N tasks. For the i-th task, the factory
has to start processing it at or after day Si, process it for Pi days, and finish the task before or at day Ei. A machine can only work on one task at a time, and each task can be processed by at most one machine at a time. However, a task can be interrupted
and processed on different machines on different days.

Now she wonders whether he has a feasible schedule to finish all the tasks in time. She turns to you for help.
 
Input
On the first line comes an integer T(T<=20), indicating the number of test cases.



You are given two integer N(N<=500) and M(M<=200) on the first line of each test case. Then on each of next N lines are three integers Pi, Si and Ei (1<=Pi, Si, Ei<=500), which have the meaning described in the description. It is guaranteed that in a feasible
schedule every task that can be finished will be done before or at its end day.
 
Output
For each test case, print “Case x: ” first, where x is the case number. If there exists a feasible schedule to finish all the tasks, print “Yes”, otherwise print “No”.



Print a blank line after each test case.
 
Sample Input
  1. 2
  2. 4 3
  3. 1 3 5
  4. 1 1 4
  5. 2 3 7
  6. 3 5 9
  7. 2 2
  8. 2 1 3
  9. 1 2 2
 
Sample Output
  1. Case 1: Yes
  2. Case 2: Yes
 
Author
allenlowesy
 
Source

题意:有n个机器,m项任务,每一个任务须要Pi天时间,开工日期到收工日期为Si到Ei。一次仅仅能在一台机器上加工,能够挪到别的机器上,问是否能按期完毕全部任务。

题解:这题关键在构图,设置一个源点到每项任务有一条边,容量为该项任务所须要的天数,每项任务到合法加工日期内的每一个天数加一条边,容量为1,即每天工作量为1。然后每一个天数到汇点加入一条边,容量为机器数量n。表示一天最大加工量。

218ms

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define maxn 1200
  5. #define maxm 700000
  6. #define inf 0x3f3f3f3f
  7.  
  8. int head[maxn], n, m, id; // n machines
  9. struct Node {
  10. int u, v, c, next;
  11. } E[maxm];
  12. int source, sink, tar, maxDay, nv;
  13. int que[maxn], Layer[maxn], pre[maxn];
  14. bool vis[maxn];
  15.  
  16. void addEdge(int u, int v, int c) {
  17. E[id].u = u; E[id].v = v;
  18. E[id].c = c; E[id].next = head[u];
  19. head[u] = id++;
  20.  
  21. E[id].u = v; E[id].v = u;
  22. E[id].c = 0; E[id].next = head[v];
  23. head[v] = id++;
  24. }
  25.  
  26. void getMap() {
  27. int i, j, u, v, p, s, e;
  28. id = tar = maxDay = 0;
  29. scanf("%d%d", &m, &n);
  30. memset(head, -1, sizeof(head));
  31. source = 0; sink = 705;
  32. for(i = 1; i <= m; ++i) {
  33. scanf("%d%d%d", &p, &s, &e);
  34. tar += p;
  35. if(e > maxDay) maxDay = e;
  36. addEdge(source, i, p);
  37. for(j = s; j <= e; ++j)
  38. addEdge(i, m + j, 1);
  39. }
  40. sink = m + maxDay + 1; nv = sink + 1;
  41. for(i = 1; i <= maxDay; ++i)
  42. addEdge(m + i, sink, n);
  43. }
  44.  
  45. bool countLayer() {
  46. memset(Layer, 0, sizeof(int) * nv);
  47. int id = 0, front = 0, u, v, i;
  48. Layer[source] = 1; que[id++] = source;
  49. while(front != id) {
  50. u = que[front++];
  51. for(i = head[u]; i != -1; i = E[i].next) {
  52. v = E[i].v;
  53. if(E[i].c && !Layer[v]) {
  54. Layer[v] = Layer[u] + 1;
  55. if(v == sink) return true;
  56. else que[id++] = v;
  57. }
  58. }
  59. }
  60. return false;
  61. }
  62.  
  63. int Dinic() {
  64. int i, u, v, minCut, maxFlow = 0, pos, id = 0;
  65. while(countLayer()) {
  66. memset(vis, 0, sizeof(bool) * nv);
  67. memset(pre, -1, sizeof(int) * nv);
  68. que[id++] = source; vis[source] = 1;
  69. while(id) {
  70. u = que[id - 1];
  71. if(u == sink) {
  72. minCut = inf;
  73. for(i = pre[sink]; i != -1; i = pre[E[i].u])
  74. if(minCut > E[i].c) {
  75. minCut = E[i].c; pos = E[i].u;
  76. }
  77. maxFlow += minCut;
  78. for(i = pre[sink]; i != -1; i = pre[E[i].u]) {
  79. E[i].c -= minCut;
  80. E[i^1].c += minCut;
  81. }
  82. while(que[id-1] != pos)
  83. vis[que[--id]] = 0;
  84. } else {
  85. for(i = head[u]; i != -1; i = E[i].next)
  86. if(E[i].c && Layer[u] + 1 == Layer[v = E[i].v] && !vis[v]) {
  87. vis[v] = 1; que[id++] = v; pre[v] = i; break;
  88. }
  89. if(i == -1) --id;
  90. }
  91. }
  92. }
  93. return maxFlow;
  94. }
  95.  
  96. void solve(int cas) {
  97. printf("Case %d: %s\n\n", cas, tar == Dinic() ? "Yes" : "No");
  98. }
  99.  
  100. int main() {
  101. // freopen("stdin.txt", "r", stdin);
  102. int t, cas;
  103. scanf("%d", &t);
  104. for(cas = 1; cas <= t; ++cas) {
  105. getMap();
  106. solve(cas);
  107. }
  108. return 0;
  109. }

62ms

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define maxn 1200
  5. #define maxm 700000
  6.  
  7. int head[maxn], n, m, id; // n machines
  8. struct Node {
  9. int u, v, c, next;
  10. } E[maxm];
  11. int source, sink, tar, maxDay, nv;
  12.  
  13. const int inf = 0x3f3f3f3f;
  14.  
  15. int cur[maxn], ps[maxn], dep[maxn];
  16.  
  17. void addEdge(int u, int v, int c) {
  18. E[id].u = u; E[id].v = v;
  19. E[id].c = c; E[id].next = head[u];
  20. head[u] = id++;
  21.  
  22. E[id].u = v; E[id].v = u;
  23. E[id].c = 0; E[id].next = head[v];
  24. head[v] = id++;
  25. }
  26.  
  27. void getMap() {
  28. int i, j, u, v, p, s, e;
  29. id = tar = maxDay = 0;
  30. scanf("%d%d", &m, &n);
  31. memset(head, -1, sizeof(head));
  32. source = 0;
  33. for(i = 1; i <= m; ++i) {
  34. scanf("%d%d%d", &p, &s, &e);
  35. tar += p;
  36. if(e > maxDay) maxDay = e;
  37. addEdge(source, i, p);
  38. for(j = s; j <= e; ++j)
  39. addEdge(i, m + j, 1);
  40. }
  41. sink = m + maxDay + 1; nv = sink + 1;
  42. for(i = 1; i <= maxDay; ++i)
  43. addEdge(m + i, sink, n);
  44. }
  45.  
  46. // 參数:顶点个数。源点,汇点
  47. int Dinic(int n, int s, int t) {
  48. int tr, res = 0;
  49. int i, j, k, f, r, top;
  50. while(true) {
  51. memset(dep, -1, n * sizeof(int));
  52. for(f = dep[ps[0] = s] = 0, r = 1; f != r; )
  53. for(i = ps[f++], j = head[i]; j != -1; j = E[j].next) {
  54. if(E[j].c && -1 == dep[k=E[j].v]) {
  55. dep[k] = dep[i] + 1; ps[r++] = k;
  56. if(k == t) {
  57. f = r; break;
  58. }
  59. }
  60. }
  61. if(-1 == dep[t]) break;
  62.  
  63. memcpy(cur, head, n * sizeof(int));
  64. for(i = s, top = 0; ; ) {
  65. if(i == t) {
  66. for(k = 0, tr = inf; k < top; ++k)
  67. if(E[ps[k]].c < tr) tr = E[ps[f=k]].c;
  68. for(k = 0; k < top; ++k)
  69. E[ps[k]].c -= tr, E[ps[k]^1].c += tr;
  70. res += tr; i = E[ps[top = f]].u;
  71. }
  72. for(j = cur[i]; cur[i] != -1; j = cur[i] = E[cur[i]].next)
  73. if(E[j].c && dep[i] + 1 == dep[E[j].v]) break;
  74. if(cur[i] != -1) {
  75. ps[top++] = cur[i];
  76. i = E[cur[i]].v;
  77. } else {
  78. if(0 == top) break;
  79. dep[i] = -1; i = E[ps[--top]].u;
  80. }
  81. }
  82. }
  83. return res;
  84. }
  85.  
  86. void solve(int cas) {
  87. printf("Case %d: %s\n\n", cas, tar == Dinic(nv, source, sink) ?
  88.  
  89. "Yes" : "No");
  90. }
  91.  
  92. int main() {
  93. // freopen("stdin.txt", "r", stdin);
  94. int t, cas;
  95. scanf("%d", &t);
  96. for(cas = 1; cas <= t; ++cas) {
  97. getMap();
  98. solve(cas);
  99. }
  100. return 0;
  101. }

HDU3572 Task Schedule 【最大流】的更多相关文章

  1. HDU3572 Task Schedule(最大流+构图思维)

    题意: 有N个任务M个机器,给每个任务i完成所花费的时间Pi且每个任务要在第Si天后开始,在第Ei天前结束,保证任务在(S,E)之间一定能完成. 每个机器在一天里只能运行一个任务,一个任务可以在中途更 ...

  2. HDU 3572 Task Schedule (最大流)

    C - Task Schedule Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  3. HDU3572:Task Schedule【最大流】

    上了一天课 心塞塞的 果然像刘老师那么说 如果你有挂科+4级没过 那基本上是WF队 题目大意:有时间补吧 思路:给每个任务向每个时间点连边容量为1 每个时间点向汇点连边 容量为机器的个数 源点向每个任 ...

  4. hdu-3572 Task Schedule---最大流判断满流+dinic算法

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持 ...

  5. HDU 3572 Task Schedule(拆点+最大流dinic)

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. hdu 3572 Task Schedule(最大流&amp;&amp;建图经典&amp;&amp;dinic)

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. hdu 3572 Task Schedule

    Task Schedule 题意:有N个任务,M台机器.每一个任务给S,P,E分别表示该任务的(最早开始)开始时间,持续时间和(最晚)结束时间:问每一个任务是否能在预定的时间区间内完成: 注:每一个任 ...

  8. hdu 3572 Task Schedule (dinic算法)

    pid=3572">Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  9. HDU3572Task Schedule(最大流 ISAP比較快)建图方法不错

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

随机推荐

  1. Devexpress DateEdit选年月 z

    Mask与Display只显示年月2012-02这种格式,但用户选择起来还是不爽,体验太差. 效果如下: 代码: using Microsoft.VisualBasic; using System; ...

  2. 转载:Hadoop权威指南学习笔记

    转自:http://pieux.github.io/blog/2013-05-08-learn-hadoop-the-definitive-guide.html 1 前言 Hadoop的内部工作机制: ...

  3. GIT 分支的理解

    乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线. 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一个源代码目录的副本 ...

  4. Web自动化框架搭建——前言

    1.web测试功能特性 a.功能逻辑测试(功能测试),这一块所有系统都是一致的,比如数据的添加.删除.修改:功能测试案例设计感兴趣和有时间的话可以另外专题探讨: b.浏览器兼容性测试,更重要的是体验这 ...

  5. python 入门实践之网页数据抓取

    这个不错.正好入门学习使用. 1.其中用到 feedparser: 技巧:使用 Universal Feed Parser 驾驭 RSS http://www.ibm.com/developerwor ...

  6. uva202:循环小数(循环节+抽屉原理)

    题意: 给出两个数n,m,0<=n,m<=3000,输出n/m的循环小数表示以及循环节长度. 思路: 设立一个r[]数组记录循环小数,u[]记录每次的count,用于标记,小数计算可用 r ...

  7. HDU-4725 The Shortest Path in Nya Graph 最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 如果直接建图复杂度过大,但是考虑到每层之间的有效边很少,只要在每层增加两个虚拟节点n+i和2*n ...

  8. Web开发人员需知的Web缓存知识

    最近的译文距今已有4年之久,原文有一定的更新.今天踩着前辈们的肩膀,再次把这篇文章翻译整理下.一来让自己对web缓存的理解更深刻些,二来让大家注意力稍稍转移下,不要整天HTML5, 面试题啊叨啊叨的~ ...

  9. 【转】iOS开发--一步步教你彻底学会『iOS应用间相互跳转』

    1. 应用间相互跳转简介 在iOS开发的过程中,我们经常会遇到需要从一个应用程序A跳转到另一个应用程序B的场景.这就需要我们掌握iOS应用程序之间的相互跳转知识. 下面来看看我们在开发过程中遇到的应用 ...

  10. 分享iOS最喜欢的技巧和提示

    转自:http://blog.csdn.net/biggercoffee/article/details/50394027 Objective-C 1.让Xcode的控制台支持LLDB类型的打印 这有 ...