Task Schedule

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6000    Accepted Submission(s):
1922

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
2
4 3
1 3 5
1 1 4
2 3 7
3 5 9
2 2
2 1 3
1 2 2
 
Sample Output
Case 1: Yes
Case 2: Yes
 
题意:有n个任务,m个机器,给你完成第i件任务的时间以及必须完成这件任务的时间区间(si,ei),一台机器一次只能执行一个任务,让你判断是否完成所有的任务;
 
题解:难在建图   注意: 我们是将天数看做流量
1、将每个任务i看做一个节点连接超级源点 s,容量为每个人物所需要的时间
2、将每个任务i看做节点, 连接完成这个任务所要进行的时间阶段内的所有点,容量为1  (表示这件任务的流量只能为1(即天数为1))
3、将所有时间段内的点连接到超级汇点t容量为m   (表示一天内共有m台机器可以同时工作)
 
 
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. #include<stack>
  5. #include<algorithm>
  6. #define INF 0x7fffff
  7. #define MAX 11000
  8. #define MAXM 1001000
  9. using namespace std;
  10. struct node
  11. {
  12. int from,to,cap,flow,next;
  13. }edge[MAXM];
  14. int ans,head[MAX];
  15. int cur[MAX];
  16. int vis[MAX];
  17. int dis[MAX];
  18. int sum,n,m;
  19. int sec;//超级汇点
  20. void init()
  21. {
  22. ans=0;
  23. memset(head,-1,sizeof(head));
  24. }
  25. void add(int u,int v,int w)
  26. {
  27. node E1={u,v,w,0,head[u]};
  28. edge[ans]=E1;
  29. head[u]=ans++;
  30. node E2={v,u,0,0,head[v]};
  31. edge[ans]=E2;
  32. head[v]=ans++;
  33. }
  34. void getmap()
  35. {
  36. int i,j,last=-1;
  37. sum=sec=0;
  38. int bt,et,time;
  39. for(i=1;i<=n;i++)
  40. {
  41. scanf("%d%d%d",&time,&bt,&et);
  42. sum+=time;
  43. add(0,i,time);//超级源点连接第i件任务
  44. for(j=bt;j<=et;j++)
  45. add(i,n+j,1);//将每件任务与完成这件任务所需要的时间段内的每一天连接
  46. last=max(last,et);
  47. }
  48. sec=n+last+1;
  49. for(i=1;i<=sec;i++)
  50. add(n+i,sec,m);//将所有的时间段内的点指向超级汇点
  51. }
  52. int bfs(int beg,int end)
  53. {
  54. int i;
  55. memset(vis,0,sizeof(vis));
  56. memset(dis,-1,sizeof(dis));
  57. queue<int>q;
  58. while(!q.empty())
  59. q.pop();
  60. vis[beg]=1;
  61. dis[beg]=0;
  62. q.push(beg);
  63. while(!q.empty())
  64. {
  65. int u=q.front();
  66. q.pop();
  67. for(i=head[u];i!=-1;i=edge[i].next)//遍历所有的与u相连的边
  68. {
  69. node E=edge[i];
  70. if(!vis[E.to]&&E.cap>E.flow)//如果边未被访问且流量未满继续操作
  71. {
  72. dis[E.to]=dis[u]+1;//建立层次图
  73. vis[E.to]=1;//将当前点标记
  74. if(E.to==end)//如果当前点搜索到终点则停止搜索 返回1表示有从原点到达汇点的路径
  75. return 1;
  76. q.push(E.to);//将当前点入队
  77. }
  78. }
  79. }
  80. return 0;//返回0表示未找到从源点到汇点的路径
  81. }
  82. int dfs(int x,int a,int end)//把找到的这条边上的所有当前流量加上a(a是这条路径中的最小残余流量)
  83. {
  84. //int i;
  85. if(x==end||a==0)//如果搜索到终点或者最小的残余流量为0
  86. return a;
  87. int flow=0,f;
  88. for(int& i=cur[x];i!=-1;i=edge[i].next)//i从上次结束时的弧开始
  89. {
  90. node& E=edge[i];
  91. if(dis[E.to]==dis[x]+1&&(f=dfs(E.to,min(a,E.cap-E.flow),end))>0)//如果
  92. {//bfs中我们已经建立过层次图,现在如果 dis[E.to]==dis[x]+1表示是我们找到的路径
  93. //如果dfs>0表明最小的残余流量还有,我们要一直找到最小残余流量为0
  94. E.flow+=f;//正向边当前流量加上最小的残余流量
  95. edge[i^1].flow-=f;//反向边
  96. flow+=f;//总流量加上f
  97. a-=f;//最小可增流量减去f
  98. if(a==0)
  99. break;
  100. }
  101. }
  102. return flow;//所有边加上最小残余流量后的值
  103. }
  104. int Maxflow(int beg,int end)
  105. {
  106. int flow=0;
  107. while(bfs(beg,end))//存在最短路径
  108. {
  109. memcpy(cur,head,sizeof(head));//复制数组
  110. flow+=dfs(beg,INF,end);
  111. }
  112. return flow;//最大流量
  113. }
  114. int main()
  115. {
  116. int t;
  117. scanf("%d",&t);
  118. int k=1;
  119. while(t--)
  120. {
  121. scanf("%d%d",&n,&m);
  122. init();
  123. getmap();
  124. printf("Case %d: ",k++);
  125. if(sum==Maxflow(0,sec))
  126. printf("Yes\n\n");
  127. else
  128. printf("No\n\n");
  129. }
  130. return 0;
  131. }

  

 

hdoj 3572 Task Schedule【建立超级源点超级汇点】的更多相关文章

  1. hdu 3572 Task Schedule (dinic算法)

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

  2. 图论--网络流--最大流 HDU 3572 Task Schedule(限流建图,超级源汇)

    Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...

  3. 解题报告:hdu 3572 Task Schedule(当前弧优化Dinic算法)

    Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...

  4. 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 ...

  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(最大流)2010 ACM-ICPC Multi-University Training Contest(13)——Host by UESTC

    题意: 告诉我们有m个任务和k个机器.第i个任务需要ci天完成,最早从第ai天开始,最晚在第bi天结束.每台机器每天可以执行一个任务.问,是否可以将所有的任务都按时完成? 输入: 首行输入一个整数t, ...

  7. HDU 3572 Task Schedule (最大流)

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

  8. hdu 3572 Task Schedule

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

  9. hdu 3572 : Task Schedule (网络流)

    题目链接 题意: 有M个机器,N个任务 对第i个任务,需要在[Si,Ei]这段时间内恰有Pi天被process 每天最多有M个机器同时工作 每一天,一个任务若被process,那么它恰占用一个机器. ...

随机推荐

  1. spring IOC源码分析(2)

    refresh这个方法包含了整个BeanFactory初始化的过程,定位资源由obtainFreshBeanFactory()来完成, protected ConfigurableListableBe ...

  2. 如何学习C++[转]

    关于学C++, 我向你推荐一些书(当然能够结合课内项目实践更好) 1.The C++ Programming Language(Bjarne Stroustrup)2. Inside The C++ ...

  3. r个有标志的球放进n个不同的盒子里,要求无一空盒,问有多少种不同的分配方案?

           由题意可知道r>=n,我原来想的是先取n个全排列,剩下的r-n个每个有n中选择,所以结果是n!*n^(r-n).经满神猜测,这样是会重复的.比如说,1到5个球,ABC三个盒子,ms ...

  4. 对话 Jessica Hamrick:和 Django 的情缘是我前行的动力

    本文出自 Your Django Story 系列,该系列主要突出那些贡献 Django 的女性.点击查看更多,本文系 OneAPM 工程师编译整理. Jess Hamrick 是加州大学伯克利分校心 ...

  5. ZOJ 2750 Idiomatic Phrases Game(Dijkstra)

    点我看题目 题意 : 给定一本字典,字典里有很多成语,要求从字典里的第一个成语开始,运用字典里的成语变到最后一个成语,变得过程就是成语接龙,后一个成语的第一个字必须有前一个成语的最后一个字相等,给定的 ...

  6. android一个纠结的VFY错误

    08-16 09:06:45.018: W/dalvikvm(2286): VFY: unable to resolve static method 3273: Lorg/slf4j/LoggerFa ...

  7. php数组遍历 使用while循环

    while() 通常和 list(),each()配合使用. $colors= array('red','blue','green','yellow'); while(list($key,$val)= ...

  8. 基于msys2工具集,自编译gcc-6.2.0、Qt-5.6.1-1和Qt-4.8.7(有nuwen.net网站提供的脚本)

    好久没更新(其实大可不要经常更新吧),一直都是用Qt4,最近想着转向Qt5了,msys2是自带Qt的,但工具链经常会更新,依赖也较多,简便才方便,做了最后一组Qt工具的更新,如题,Qt-4.8.7作为 ...

  9. Android java.lang.ClassCastException

    lassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误.下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法. 这种 ...

  10. (转载)NET流操作

    http://www.oseye.net/user/kevin/blog/86 概念 数据流(Stream)是对串行传输数据的一种抽象表示,是对输入/输出的一种抽象.数据有来源和目的地,衔接两者的就是 ...