这是09年的多校联赛题目,比10年的难度要大。如果没做过hdu3572,建议先去做。有了解题思维再来做这题。

  这题与hdu3572类似。但是1 <= si < ei <= 1,000,000的限制使得我们如果像HDU3572那样建图,会使得边的数量太多。从而超时。

  看看别人的题解 http://www.cnblogs.com/wally/archive/2013/05/03/3057066.html  离散化的思想

 

  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 T[N],st[N],ed[N];
  75. int main()
  76. {
  77. //freopen("test.txt","r",stdin);
  78. int n,m,i,j,k,a,b,c,sum,s,t;
  79. while(scanf("%d%d",&n,&m)!=EOF)
  80. {
  81. init();
  82. sum=;s=n+;
  83. k=;
  84. for(i=;i<=n;i++)
  85. {
  86. scanf("%d%d%d%d",&st[i],&b,&ed[i],&t);
  87. sum+=b*t;
  88. addedge(s,i,b*t);
  89. T[k++]=st[i];
  90. T[k++]=ed[i];
  91. }
  92. sort(T,T+k);
  93. j=;
  94. for(i=;i<k;i++)
  95. if(T[j]!=T[i]) T[++j]=T[i];
  96. k=s++j;
  97. for(i=;i<=j;i++)
  98. {
  99. addedge(s+i,k,m*(T[i]-T[i-]));
  100. for(t=;t<=n;t++)
  101. if(st[t]<=T[i-]&&ed[t]>=T[i]) addedge(t,i+s,INF);
  102. }
  103. SAP(s,k,k);
  104. if(ans==sum) printf("Yes\n");
  105. else printf("No\n");
  106. }
  107. return ;
  108. }

hdu2883 最大流,判断满流 优化的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. hdu3572Task Schedule 最大流,判断满流 优化的SAP算法

    PS:多校联赛的题目质量还是挺高的.建图不会啊,看了题解才会的. 参考博客:http://blog.csdn.net/luyuncheng/article/details/7944417 看了上面博客 ...

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

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

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

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

  9. hdu4888 多校B 最大流以及最大流唯一判断+输出方案

    题意,给一个矩阵,告诉你每行和.每列和,并且限制所填数不大于k,问矩阵是否唯一. 经典建图不说了,第一次遇到判断最大流唯一性的,学习了:用dfs来判断残网中是否还存在环,若存在,则表明绕这个环走一圈, ...

随机推荐

  1. 单链表每k个节点一组进行反转(最后不足k个也反转)

    一道面试题,第一次碰到这道题的时候 要求10分钟之内手写代码实现,当时没写出来,后来花点时间把过程梳理一遍,也挺简单的....... 思路就是在原来单链表反转的基础上,加几个控制参数,记录几个关键节点 ...

  2. 数据清理,预处理 pandas dataframe 操作技巧 总结

    dsoft2 = data1.loc[(data1['程'] == "轻") | (data1['程'] == "中")]设置x下标plt.xticks(np. ...

  3. How to use pthread_create && mutex?

    1 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread. ...

  4. 1016 部分A+B (15 分)

    正整数 AAA 的“DAD_AD​A​​(为 1 位整数)部分”定义为由 AAA 中所有 DAD_AD​A​​ 组成的新整数 PAP_AP​A​​.例如:给定 A=3862767A = 3862767 ...

  5. 多重循环、缓冲区管理、数组(day06)

    无法预知的数字叫随机数 rand标准函数可以用来获得随机数 为了使用这个标准函数需要包含stdlib.h头文件 srand标准函数用来设置随机数种子 这个函数把一个整数作为种子使用 不同的种子产生的随 ...

  6. zabbix监控AIX DB2数据库

    记一次工作中使用zabbix监控aix db2数据库的经历. 记忆要点: 1.使用自定义perl脚本: 2.由于zabbix用户权限的原因,无法调用db2用户获取数据库的数据,所以在zabbix配置文 ...

  7. windows 禁用 magic mouse2 左右移动

    相信大部分程序员同志,只要用macbook都回装双系统的,本人也不例外,因为需要用到vs等很多开发工具. magic mouse2在osx上的表现本人不做评论,没用过几回,在win10上的表现太差劲了 ...

  8. BNU 34986 Football on Table

    "Bored? Let's play table football!" The table football is played on a rectangular table, u ...

  9. cefsharp 获取高度

    G.browser.GetBrowser().MainFrame.ExecuteJavaScriptAsync("$(document).height()"); // Get Do ...

  10. ASP怎样检測某目录是否存在,不存在则自己主动创建

    ASP怎样检測某目录是否存在,不存在则自己主动创建 folder=server.mappath("/imagess")  Set fso = CreateObject(" ...