PS:多校联赛的题目质量还是挺高的。建图不会啊,看了题解才会的。

  参考博客:http://blog.csdn.net/luyuncheng/article/details/7944417

  看了上面博客里的题解,思路就有了。不过建图还是有点麻烦。我把源点设为n+1 (不想从0开始,不修改模版),汇点就是n+2+MAX,其中MAX是题目中Ei的最大值。

  这题,我有疑问:优化过的SAP算法的时间复杂度是O(m*n^2),此题的n最大为1000,m为50万,时间超过5亿了。1s的时限居然过了。

  其中有个小插曲,我想了好久才明白的。为什么是判断满流,最后一定要用 “==”? >=不可以么?最后想明白了,其实求出来的最大流的值一定是<= sum的。因为从源点出来的流值最大也才sum。  

  下面是代码:  建图会了用模版就可以了。模版参考哈工大的《图论及应用》。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. const int N=,M=, INF=0x3f3f3f3f;
  8. struct node
  9. {
  10. int to,next,w;
  11. }edge[M];
  12. int head[N],numh[N],h[N],cure[N],pre[N];
  13. //numh:GAP优化的统计高度数量数组; h:距离标号数组; cure:当前弧
  14. int ans,tot;
  15. void SAP(int s, int e,int n)
  16. {
  17. int flow,u,tmp,neck,i;
  18. ans=;
  19. for(i=;i<=n;i++)
  20. cure[i]=head[i];
  21. numh[]=n;
  22. u=s;
  23. while(h[s]<n)
  24. {
  25. if(u==e)
  26. {
  27. flow =INF;
  28. for(i=s;i!=e;i=edge[cure[i]].to)
  29. {
  30. if(flow>edge[cure[i]].w)
  31. {
  32. neck=i;
  33. flow =edge[cure[i]].w;
  34. }
  35. }
  36. for(i=s;i!=e;i=edge[cure[i]].to)
  37. {
  38. tmp=cure[i];
  39. edge[tmp].w-=flow;
  40. edge[tmp^].w+=flow;
  41. }
  42. ans+=flow;
  43. u=neck;
  44. }
  45. for(i=cure[u];i!=-;i=edge[i].next)
  46. if(edge[i].w && h[u]==h[edge[i].to]+) break;
  47. if(i!=-) {cure[u]=i;pre[edge[i].to]=u;u=edge[i].to;}
  48. else
  49. {
  50. if(==--numh[h[u]]) break; //GAP优化
  51. cure[u]=head[u];
  52. for(tmp=n,i=head[u];i!=-;i=edge[i].next)
  53. if(edge[i].w) tmp=min(tmp, h[edge[i].to]);
  54. h[u]=tmp+;
  55. ++numh[h[u]];
  56. if(u!=s) u=pre[u];
  57. }
  58. }
  59. }
  60. void init()
  61. {
  62. tot=;
  63. memset(head,-,sizeof(head));
  64. memset(pre,-,sizeof(pre));
  65. memset(h,,sizeof(h));
  66. memset(numh,,sizeof(numh));
  67.  
  68. }
  69. void addedge(int i,int j,int w)
  70. {
  71. edge[tot].to=j;edge[tot].w=w;edge[tot].next=head[i];head[i]=tot++;
  72. edge[tot].to=i;edge[tot].w=;edge[tot].next=head[j];head[j]=tot++;
  73. }
  74. int main()
  75. {
  76. //freopen("test.txt","r",stdin);
  77. int n,m,i,j,k,cas,t=,a,b,c,MAX,sum,s;
  78. scanf("%d",&cas);
  79. while(cas--)
  80. {
  81. scanf("%d%d",&n,&m);
  82. init();
  83. MAX=;sum=;s=n+;
  84. for(i=;i<=n;i++)
  85. {
  86. scanf("%d%d%d",&a,&b,&c);
  87. sum+=a;
  88. MAX=max(MAX,c);
  89. addedge(s,i,a);
  90. for(j=b;j<=c;j++)
  91. addedge(i,j+s,);
  92. }
  93. k=s++MAX;
  94. for(i=;i<=MAX;i++)
  95. addedge(s+i,k,m);
  96. SAP(s,k,k);
  97. printf("Case %d: ",t++);
  98. if(ans==sum) printf("Yes\n\n");
  99. else printf("No\n\n");
  100. }
  101. return ;
  102. }

hdu3572Task Schedule 最大流,判断满流 优化的SAP算法的更多相关文章

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

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

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

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

  3. hdu 3572 最大流判断满流

    #include<stdio.h> #include<string.h> #include<queue> using namespace std; #define ...

  4. HDU 3572 Task Schedule(最大流判断满流)

    https://vjudge.net/problem/HDU-3572 题意: 有N个作业和M台机器,每个作业都有一个持续时间P,工作的日期为S~E.作业可以断断续续的在不同机器上做,每台机器每次只可 ...

  5. hdu3572 任务分配/最大流判断满流

    题意:将n个任务分配为m个机器,给每个任务需要的天数(无需每天连续),和可以在哪些天去做该任务,求是否存在方案. 典型的任务(X)----天(Y)二分最大流,(因为这里任务是与天的关系)处理器控制流量 ...

  6. hdu2883 最大流,判断满流 优化的SAP算法

    这是09年的多校联赛题目,比10年的难度要大.如果没做过hdu3572,建议先去做.有了解题思维再来做这题. 这题与hdu3572类似.但是1 <= si < ei <= 1,000 ...

  7. HDU3605 Escape(最大流判满流 + 状压)

    [题意]: 有N个人,M个星球,给N*M矩阵,(i, j)为1代表i可以到j星球,0代表不能,问是否能把所有人转移走. [思路]: N的范围为1e6,如果让每个人与星球连边一定TLE,再根据矩阵每一行 ...

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

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

  9. 初识费用流 模板(spfa+slf优化) 餐巾计划问题

    今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...

随机推荐

  1. 【转载】解决方案:git@github.com出现Permission denied (publickey)

    遇到的问题 今天心血来潮,想将intellij上的项目代码放到GitHub上管理. 在进行添加远程库的时候,出现了:git@github.com出现Permission denied (publick ...

  2. 【剑指Offer】34、第一个只出现一次的字符

      题目描述:   在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).   解题思路: ...

  3. C#第五节课

    switch语句 using System;using System.Collections.Generic;using System.Linq;using System.Text;using Sys ...

  4. 洛谷P1339 [USACO09OCT]热浪Heat Wave

    思路:裸SPFA过一遍(建议使用邻接链表存储),无向图,无向图,无向图,重要的事情要说三遍!!!蜜汁RE是什么鬼????第九个点数组开到20K,第十个点数组开到30K才AC.或许我代码写的有bug?( ...

  5. linux配置Jdk1.8

    Jdk1.8:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html cd /usr/ ...

  6. Vue CLI 3 中文文档

    翻译文档 文档翻译全貌 前言 之前写了一篇Vue CLI 3.x 版本的简单体验,当时文档还不全,具体的使用方法并不是很清楚,大概是2月7号,收到Vue CLI 3接近Beta版的提示,作者尤雨溪也讲 ...

  7. 12.IDEA中自动导资源包

    在idea工程中,当你赋值一个类文件的部分代码,粘贴到另一个文件中时,需要导入原来文件中的包资源, 自动设置如下

  8. elasticsearch 权威指南聚合阅读笔记(七)

    count(1) select clssId,count(1) from student group by  classId { "size":0, "aggs" ...

  9. hdu 1829 带权并查集的运用类似于食物链但是更简单些

    #include<stdio.h> #define N 1100000 struct node { int x,y; }f[N],pre[N]; int find(int x) { if( ...

  10. iOS中基于 Socket 的 C/S 结构网络通信(中)

    结合上一篇的知识.接下来将介绍基于 TCP 协议的 Socket  编程.因为 Socket 须要有client和服务端,那么如今实现的是关于服务端的简单程序.服务端採用的是CFStream 类来实现 ...