HDU 3572 Task Schedule
传送门
作业调度,这道题还真没想到能用网络流。。。。乍一看跟背包问题差不多。
有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_N
、M
这些值都是整数且大于等于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相关推荐
- hdu 3572 Task Schedule 网络流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 Our geometry princess XMM has stoped her study i ...
- hdu 3572 Task Schedule IPSA 最大流
题意: 题目意思: 给出 N 件任务和 M台机器, 这N件任务都一个限制: 必须在 [S,E] 之间完成, 而且完成的时间不能超过 P. 一台机器每天只能做意见任务, 不过庆幸的是: 任务是可以拆分的 ...
- 题解报告:hdu 4907 Task schedule
Problem Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务. 有m个询问,每个询问有一个数字q,表示如果在q时 ...
- HDU 4907 BestCoder3_1 Task schedule
Task schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- light task schedule的定时任务实现源码解析
light task schedule(以下简称lts)的任务调度是在jobTracker中实现的. 以下关于任务队列的数据存储以mysql为例子. jobTracker中进行调度的任务需要jobCl ...
- TASK SCHEDULE(任务计划)服务无法运行 解决方案
Q:TASK SCHEDULE(任务计划)服务无法运行? A:因为Event Log服务没有打开,所以TASK SCHEDULE服务也打不开 转载于:https://www.cnblogs.com/w ...
- LTS 轻量级分布式任务调度框架(Light Task Schedule) - 推酷
LTS 轻量级分布式任务调度框架(Light Task Schedule) - 推酷
- HDU 4864 Task(2014多校--贪心)
Task 比赛当时思路想的差不多,感觉能过的,该处理的也都处理到了,最后还是没过,可能是二分写错了吧-.- 大意:给你n个机器,m个要完成的任务,每个机器跟任务都有两个属性,机器是最大工作时间跟等级, ...
- Task Schedule
http://acm.hdu.edu.cn/showproblem.php?pid=3572 题意:给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持续工作的时间P.每 ...
最新文章
- java代码程序_Java程序代码
- codeblocks如何watch指针
- java rabbitmq 工具类_RabbitMq通用管理工具类
- 《女仆咖啡帕露菲》香浓背后,激励的力量
- PHP的函数file_get_contents() 把整个文件读入一个字符串中
- 【04】AngularJS 表达式
- pyMagic:用python控制的Geek入门神器
- android:SQlite
- 北漂鱼引导页HTML源码
- 【OpenCV】OpenCV访问像素点的三种方式
- C++之继承探究(十一):多重继承、菱形继承、虚继承、二义性问题及其解决方案
- 关于jquery基本过滤器中:eq()无法传变量的问题
- android上层应用apk到G-sensor driver的大致流程
- Leetcode--221--Maximal Square
- VSCode批量代码比较
- linux终端快捷键(持续更新)
- 【quick-cocos2d-lua】 疯狂牛牛
- ntp服务restrict_Linux配置ntp时间服务器(全)
- Oracle、mysql产品性能优化总结
- 福建农林大学计算机分数线,福建农林大学录取分数线2021是多少分(附历年录取分数线)...
热门文章
- json qbytearray 串 转_JSON数据采集网关,json转Modbus RTU串IO口RS485转4~20mA边缘计算智能终端...
- 呆在实验室到深夜的小随笔
- php中获取本月第二天,php第二天
- mysql居左查询abcd_数据库--查询语句
- git 怎么提交忽略文件夹_git 设置忽略文件提交的几种方式
- android怎样禁用整个布局点击,Android - 自动禁用布局里的所有子控件
- c语言中二维数组的结构体,怎么才能把结构体里面的二维数组打印出来?
- 《Head First设计模式》第三章笔记 装饰者模式
- C++:23 再议const的用法(下)
- php 不同时区时间转换,在PHP中将DateTime字符串转换为不同的时区