传送门

作业调度,这道题还真没想到能用网络流。。。。乍一看跟背包问题差不多。
N个作业,M个机器,每个作业给你一个耗费时间(时间段)以及最早开始时间和最晚完成时间(这两个是时间点),单位是天。一个作业同时只能被一个机器做,一个机器同时也只能做一个作业,但是,可以只做一部分,之后可以切换别的机器做。一部分指的是整数天。

画个图。把数据处理成上面这个图,然后按照最大流求解就ojbk了,看看最后的最大流是不是P1+P2+P3+...+PN(最大流必然小于等于这个,因为从源点输出就这么些)
源点输出到每个作业,权值等于这个作业的耗费时间P,代表你这个作业要处理P次(每次1天);然后的N+1,N+2这些代表具体的某一天(整体上不一定连续每天都有,要根据每个作业的上下限来定),比如第一个作业的上下限是[N+1,N+3],那么就把这个作业和这个上下限内的每一天都连上一条边,权值是1(此时不用关心这个作业的花费时间,因为前面从源点连的边已限制这一点),权值是1表示某一天内只能处理这个作业1天的完成量(这不是废话么);然后,代表某一天的每个点都要和汇点连上一条权值为M的边,代表这一天最多能同时处理M个作业(因为机器只有M个)。
这个图并不关心某个作业被具体哪些机器处理,因为这个不重要。只关心某个作业必须在哪些天内被处理,以及某一天最多同时处理多少个作业。

这个题还有个问题,就是他没说清楚P<=E-S还是P<=E-S+1。这关系到在上面的图中某个作业要连接E-S个点还是E-S+1个点。
当然,在样例中的第二个输出为Yes说明了是后者。但是真的够sb的。

【19.3.18 想法】今天结合HDU 2883这个题,突然想到一个问题:该方法怎么保证某机器某一天一定处理某任务1天的工作量?而不是0.5个工作量?(也就是说从某任务点某天数点的流量会不会大于0小于1?)
答案是不会的,因为P_NM这些值都是整数且大于等于1,考虑最大流算法寻找增广路的过程,权值为1的边肯定是整条路上权值最小的边,这条路的流量不可能比1再小了。

dinic

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
#include <queue>
using namespace std;const int MAX = 500 + 500 + 2 + 10;
const int INF = 1e9;
int N, M, T;
int flow;
int sum;struct Edge
{int f, t, flow, cap;
};
vector<Edge> ve;
vector<int> v[MAX];int P, S, E;
bool vis[MAX];
int level[MAX];
int cur[MAX];void addEdge(int from, int to, int weight)
{ve.push_back(Edge{ from,to,0,weight });ve.push_back(Edge{ to,from,0,0 });v[from].push_back(ve.size() - 2);v[to].push_back(ve.size() - 1);
}void init()
{ve.clear();for (int i = 0; i <= N + 500 + 1; i++)v[i].clear();flow = sum = 0;memset(vis, 0, sizeof vis);
}bool bfs(int t)
{memset(level, -1, sizeof level);queue<int> q;q.push(0);level[0] = 0;for (; !q.empty();){int x = q.front();q.pop();for (int i = 0; i < v[x].size(); i++){Edge &e = ve[v[x][i]];if (level[e.t] < 0 && e.flow < e.cap){level[e.t] = level[x] + 1;q.push(e.t);}}}return level[t] >= 0;
}int dfs(int n, int t, int f)
{if(n == t || f == 0) return f;                   //for (int& i = cur[n]; i < v[n].size(); i++){Edge& e = ve[v[n][i]];int f0;if (level[e.t] == level[n] + 1 && (f0 = dfs(e.t, t, min(f, e.cap - e.flow))) > 0){e.flow += f0;ve[v[n][i] ^ 1].flow -= f0;return f0;}}return 0;
}int main()
{scanf("%d", &T);for (int cnt = 1; cnt <= T; cnt++){scanf("%d%d", &N, &M);init();for (int i = 1; i <= N; i++){scanf("%d%d%d", &P, &S, &E);if (P > E - S + 1)                      //{printf("Case %d: No\n\n", cnt);return 0;}addEdge(0, i, P);for (int j = S; j <= E; j++){addEdge(i, j + N, 1);//addEdge(j + N, 500 + N + 1, M);vis[j + N] = true;}sum += P;}for (int i = N + 1; i <= N + 500; i++)if (vis[i])addEdge(i, N + 500 + 1, M);for (; bfs(N + 500 + 1);){memset(cur, 0, sizeof cur);int temp;for (; temp = dfs(0, N + 500 + 1, INF);)flow += temp;//cout << flow;}printf("Case %d: %s\n\n", cnt, flow == sum ? "Yes" : "No");}return 0;
}

转载于:https://www.cnblogs.com/CrossingOver/p/10704876.html

HDU 3572 Task Schedule相关推荐

  1. hdu 3572 Task Schedule 网络流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 Our geometry princess XMM has stoped her study i ...

  2. hdu 3572 Task Schedule IPSA 最大流

    题意: 题目意思: 给出 N 件任务和 M台机器, 这N件任务都一个限制: 必须在 [S,E] 之间完成, 而且完成的时间不能超过 P. 一台机器每天只能做意见任务, 不过庆幸的是: 任务是可以拆分的 ...

  3. 题解报告:hdu 4907 Task schedule

    Problem Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务. 有m个询问,每个询问有一个数字q,表示如果在q时 ...

  4. HDU 4907 BestCoder3_1 Task schedule

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

  5. light task schedule的定时任务实现源码解析

    light task schedule(以下简称lts)的任务调度是在jobTracker中实现的. 以下关于任务队列的数据存储以mysql为例子. jobTracker中进行调度的任务需要jobCl ...

  6. TASK SCHEDULE(任务计划)服务无法运行 解决方案

    Q:TASK SCHEDULE(任务计划)服务无法运行? A:因为Event Log服务没有打开,所以TASK SCHEDULE服务也打不开 转载于:https://www.cnblogs.com/w ...

  7. LTS 轻量级分布式任务调度框架(Light Task Schedule) - 推酷

    LTS 轻量级分布式任务调度框架(Light Task Schedule) - 推酷

  8. HDU 4864 Task(2014多校--贪心)

    Task 比赛当时思路想的差不多,感觉能过的,该处理的也都处理到了,最后还是没过,可能是二分写错了吧-.- 大意:给你n个机器,m个要完成的任务,每个机器跟任务都有两个属性,机器是最大工作时间跟等级, ...

  9. Task Schedule

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

最新文章

  1. java代码程序_Java程序代码
  2. codeblocks如何watch指针
  3. java rabbitmq 工具类_RabbitMq通用管理工具类
  4. 《女仆咖啡帕露菲》香浓背后,激励的力量
  5. PHP的函数file_get_contents() 把整个文件读入一个字符串中
  6. 【04】AngularJS 表达式
  7. pyMagic:用python控制的Geek入门神器
  8. android:SQlite
  9. 北漂鱼引导页HTML源码
  10. 【OpenCV】OpenCV访问像素点的三种方式
  11. C++之继承探究(十一):多重继承、菱形继承、虚继承、二义性问题及其解决方案
  12. 关于jquery基本过滤器中:eq()无法传变量的问题
  13. android上层应用apk到G-sensor driver的大致流程
  14. Leetcode--221--Maximal Square
  15. VSCode批量代码比较
  16. linux终端快捷键(持续更新)
  17. 【quick-cocos2d-lua】 疯狂牛牛
  18. ntp服务restrict_Linux配置ntp时间服务器(全)
  19. Oracle、mysql产品性能优化总结
  20. 福建农林大学计算机分数线,福建农林大学录取分数线2021是多少分(附历年录取分数线)...

热门文章

  1. json qbytearray 串 转_JSON数据采集网关,json转Modbus RTU串IO口RS485转4~20mA边缘计算智能终端...
  2. 呆在实验室到深夜的小随笔
  3. php中获取本月第二天,php第二天
  4. mysql居左查询abcd_数据库--查询语句
  5. git 怎么提交忽略文件夹_git 设置忽略文件提交的几种方式
  6. android怎样禁用整个布局点击,Android - 自动禁用布局里的所有子控件
  7. c语言中二维数组的结构体,怎么才能把结构体里面的二维数组打印出来?
  8. 《Head First设计模式》第三章笔记 装饰者模式
  9. C++:23 再议const的用法(下)
  10. php 不同时区时间转换,在PHP中将DateTime字符串转换为不同的时区