思想就是把时间段离散化,然后用个点来表示一段时间

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include <algorithm>
  5. #include <math.h>
  6. #include <queue>
  7. using namespace std;
  8. const int N = ;
  9. const int INF = ;
  10. struct Edge{
  11. int v,w,next;
  12. }edge[N*N];
  13. int head[N];
  14. int level[N];
  15. int tot;
  16. void init()
  17. {
  18. memset(head,-,sizeof(head));
  19. tot=;
  20. }
  21. void addEdge(int u,int v,int w,int &k)
  22. {
  23. edge[k].v = v,edge[k].w=w,edge[k].next=head[u],head[u]=k++;
  24. edge[k].v = u,edge[k].w=,edge[k].next=head[v],head[v]=k++;
  25. }
  26. int BFS(int src,int des)
  27. {
  28. queue<int>q;
  29. memset(level,,sizeof(level));
  30. level[src]=;
  31. q.push(src);
  32. while(!q.empty())
  33. {
  34. int u = q.front();
  35. q.pop();
  36. if(u==des) return ;
  37. for(int k = head[u]; k!=-; k=edge[k].next)
  38. {
  39. int v = edge[k].v;
  40. int w = edge[k].w;
  41. if(level[v]==&&w!=)
  42. {
  43. level[v]=level[u]+;
  44. q.push(v);
  45. }
  46. }
  47. }
  48. return -;
  49. }
  50. int dfs(int u,int des,int increaseRoad){
  51. if(u==des||increaseRoad==) return increaseRoad;
  52. int ret=;
  53. for(int k=head[u];k!=-;k=edge[k].next){
  54. int v = edge[k].v,w=edge[k].w;
  55. if(level[v]==level[u]+&&w!=){
  56. int MIN = min(increaseRoad-ret,w);
  57. w = dfs(v,des,MIN);
  58. if(w > )
  59. {
  60. edge[k].w -=w;
  61. edge[k^].w+=w;
  62. ret+=w;
  63. if(ret==increaseRoad) return ret;
  64. }
  65. else level[v] = -;
  66. if(increaseRoad==) break;
  67. }
  68. }
  69. if(ret==) level[u]=-;
  70. return ret;
  71. }
  72. int Dinic(int src,int des)
  73. {
  74. int ans = ;
  75. while(BFS(src,des)!=-) ans+=dfs(src,des,INF);
  76. return ans;
  77. }
  78. int n,m;
  79. int s[N],num[N],e[N],t[N];
  80. int time[N];
  81. int main()
  82. {
  83. while(scanf("%d%d",&n,&m)!=EOF){
  84. init();
  85. int k = ;
  86. int sum = ;
  87. for(int i=;i<=n;i++){
  88. scanf("%d%d%d%d",&s[i],&num[i],&e[i],&t[i]);
  89. sum += num[i]*t[i];
  90. time[++k] = s[i];
  91. time[++k] = e[i];
  92. }
  93. sort(time+,time+k+);
  94. int cnt = ;
  95. for(int i=;i<=k;i++){
  96. if(time[i]==time[i-]) continue;
  97. time[++cnt] = time[i];
  98. }
  99. int src = ,des = n+cnt+;
  100. for(int i=;i<=n;i++){
  101. addEdge(src,i,num[i]*t[i],tot);
  102. }
  103. for(int i=;i<=n;i++){
  104. for(int j=;j<=cnt;j++){
  105. if(s[i]<=time[j-]&&time[j]<=e[i]){
  106. addEdge(i,n+j,INF,tot);
  107. }
  108. }
  109. }
  110. for(int i=;i<=cnt;i++){
  111. addEdge(n+i,des,(time[i]-time[i-])*m,tot);
  112. }
  113. if(Dinic(src,des)==sum) printf("Yes\n");
  114. else printf("No\n");
  115. }
  116. return ;
  117. }

最大流任务调度+离散化——hdu2883的更多相关文章

  1. 最大流任务调度——hdu3572二分图建图

    很简单的任务调度模板题 把一个工作完成一天的量当做是边 /* 任务调度问题最大流 因为两个任务之间是没有关系的,两天之间也是没有关系的 所以抽象成二分图 任务i在天数[si,ei]之间都连一条双向边, ...

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

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

  3. HDU-6532 Chessboard 2019广东省省赛B题(费用流)

    比赛场上很容易想到是费用流,但是没有想到建图方法qwq,太弱了. 这里直接贴官方题解: 费用流.离散化坐标,每行用一个点表示,每列也用一个点表示.表示第i-1行的点向表示第i行的点连边,容量为第i行及 ...

  4. Spark 生态系统组件

    摘要: 随着大数据技术的发展,实时流计算.机器学习.图计算等领域成为较热的研究方向,而Spark作为大数据处理的“利器”有着较为成熟的生态圈,能够一站式解决类似场景的问题.那你知道Spark生态系统有 ...

  5. 最长k可重区间集问题

    费用流,离散化后,l向r连费用为负长度的边容量为1 相邻的连容量为k的边,最好建S和T # include <bits/stdc++.h> # define RG register # d ...

  6. POJ 3762 The Bonus Salary!

    The Bonus Salary! Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on PKU. Origi ...

  7. CF704D Captain America

    http://codeforces.com/problemset/problem/704/D 题解 对于两种颜色的染色,我们可以把它看做选择问题. 比如说红色的代价小,所以我们尽可能多的染红色. 然后 ...

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

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

  9. Discretized Streams, 离散化的流数据处理

    Discretized Streams: An Efficient and Fault-Tolerant Model for Stream Processing on Large Clusters   ...

随机推荐

  1. layerui ios不适应问题

    .admin-main {-webkit-overflow-scrolling: touch; overflow: scroll; position: absolute; left: 0; top:  ...

  2. Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci...

    最近刚接触mysql,今天用mysql插入中文字符的时候,程序报错“Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_g ...

  3. VC++6.0环境中输出特殊字符

    该方法最靠谱:https://blog.csdn.net/xiaofeilong321/article/details/8713002 输出特殊字符需使用扩展的ASCII码. 修改控制台显示设置: ( ...

  4. bootstrapValidator--表单校验

    关于表单校验 要依次引入 <link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css"& ...

  5. 01退背包——bzoj2287

    退背包就是限制某一件物品不可取的方案数 先做出无限制的方案数,然后对于当前不可取的物品,dp2[j]表示不取改物品情况下,取得体积为j的方案数 有状态方程 dp2[j]=dp1[j]-dp2[j-w[ ...

  6. hive的行列互转

    行转列 多行转多列 数据表 row2col col1 col2 col3 a c 1 a d 2 a e 3 b c 4 b d 5 b e 6 现在要将其转化为: col1 c d e a 1 2 ...

  7. NX二次开发-UFUN获取圆锥参数UF_MODL_ask_cone_parms

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize( ...

  8. NX二次开发-打开part对话框UF_UI_open_part

    这是UFUN帮助的官方例子 /****************************************************************************** Copyri ...

  9. 数据结构C++版-队列

    一.概念 分类: 二.补充说明 1.<面向对象的队列设计>课程问答: 首先要明确数据结构和数据存储结构的概念. 数据结构是指数据对象之间的逻辑关系,例如二叉树,队列,栈等,而数据存储结构是 ...

  10. Cortex-M3的异常/中断屏蔽寄存器组

    转自 1. Cortex-M3的异常/中断屏蔽寄存器组 注:只有在特权级下,才允许访问这3个寄存器. 名 字 功能描述 PRIMASK 只有单一比特的寄存器.置为1后,就关掉所有可屏蔽异常,只剩下NM ...