Task Schedule

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 4003    Accepted Submission(s): 1347
Problem Description
Our geometry princess XMM has stoped her study in computational geometry to concentrate on her newly opened factory. Her factory has introduced M new machines in order to process the coming N tasks. For the i-th task, the factory
has to start processing it at or after day Si, process it for Pi days, and finish the task before or at day Ei. A machine can only work on one task at a time, and each task can be processed by at most one machine at a time. However, a task can be interrupted
and processed on different machines on different days.

Now she wonders whether he has a feasible schedule to finish all the tasks in time. She turns to you for help.
 
Input
On the first line comes an integer T(T<=20), indicating the number of test cases.



You are given two integer N(N<=500) and M(M<=200) on the first line of each test case. Then on each of next N lines are three integers Pi, Si and Ei (1<=Pi, Si, Ei<=500), which have the meaning described in the description. It is guaranteed that in a feasible
schedule every task that can be finished will be done before or at its end day.
 
Output
For each test case, print “Case x: ” first, where x is the case number. If there exists a feasible schedule to finish all the tasks, print “Yes”, otherwise print “No”.



Print a blank line after each test case.
 
Sample Input
2
4 3
1 3 5
1 1 4
2 3 7
3 5 9 2 2
2 1 3
1 2 2
 
Sample Output
Case 1: Yes Case 2: Yes
 
Author
allenlowesy
 
Source

题意:有n个机器,m项任务,每一个任务须要Pi天时间,开工日期到收工日期为Si到Ei。一次仅仅能在一台机器上加工,能够挪到别的机器上,问是否能按期完毕全部任务。

题解:这题关键在构图,设置一个源点到每项任务有一条边,容量为该项任务所须要的天数,每项任务到合法加工日期内的每一个天数加一条边,容量为1,即每天工作量为1。然后每一个天数到汇点加入一条边,容量为机器数量n。表示一天最大加工量。

218ms

#include <stdio.h>
#include <string.h> #define maxn 1200
#define maxm 700000
#define inf 0x3f3f3f3f int head[maxn], n, m, id; // n machines
struct Node {
int u, v, c, next;
} E[maxm];
int source, sink, tar, maxDay, nv;
int que[maxn], Layer[maxn], pre[maxn];
bool vis[maxn]; void addEdge(int u, int v, int c) {
E[id].u = u; E[id].v = v;
E[id].c = c; E[id].next = head[u];
head[u] = id++; E[id].u = v; E[id].v = u;
E[id].c = 0; E[id].next = head[v];
head[v] = id++;
} void getMap() {
int i, j, u, v, p, s, e;
id = tar = maxDay = 0;
scanf("%d%d", &m, &n);
memset(head, -1, sizeof(head));
source = 0; sink = 705;
for(i = 1; i <= m; ++i) {
scanf("%d%d%d", &p, &s, &e);
tar += p;
if(e > maxDay) maxDay = e;
addEdge(source, i, p);
for(j = s; j <= e; ++j)
addEdge(i, m + j, 1);
}
sink = m + maxDay + 1; nv = sink + 1;
for(i = 1; i <= maxDay; ++i)
addEdge(m + i, sink, n);
} bool countLayer() {
memset(Layer, 0, sizeof(int) * nv);
int id = 0, front = 0, u, v, i;
Layer[source] = 1; que[id++] = source;
while(front != id) {
u = que[front++];
for(i = head[u]; i != -1; i = E[i].next) {
v = E[i].v;
if(E[i].c && !Layer[v]) {
Layer[v] = Layer[u] + 1;
if(v == sink) return true;
else que[id++] = v;
}
}
}
return false;
} int Dinic() {
int i, u, v, minCut, maxFlow = 0, pos, id = 0;
while(countLayer()) {
memset(vis, 0, sizeof(bool) * nv);
memset(pre, -1, sizeof(int) * nv);
que[id++] = source; vis[source] = 1;
while(id) {
u = que[id - 1];
if(u == sink) {
minCut = inf;
for(i = pre[sink]; i != -1; i = pre[E[i].u])
if(minCut > E[i].c) {
minCut = E[i].c; pos = E[i].u;
}
maxFlow += minCut;
for(i = pre[sink]; i != -1; i = pre[E[i].u]) {
E[i].c -= minCut;
E[i^1].c += minCut;
}
while(que[id-1] != pos)
vis[que[--id]] = 0;
} else {
for(i = head[u]; i != -1; i = E[i].next)
if(E[i].c && Layer[u] + 1 == Layer[v = E[i].v] && !vis[v]) {
vis[v] = 1; que[id++] = v; pre[v] = i; break;
}
if(i == -1) --id;
}
}
}
return maxFlow;
} void solve(int cas) {
printf("Case %d: %s\n\n", cas, tar == Dinic() ? "Yes" : "No");
} int main() {
// freopen("stdin.txt", "r", stdin);
int t, cas;
scanf("%d", &t);
for(cas = 1; cas <= t; ++cas) {
getMap();
solve(cas);
}
return 0;
}

62ms

#include <stdio.h>
#include <string.h> #define maxn 1200
#define maxm 700000 int head[maxn], n, m, id; // n machines
struct Node {
int u, v, c, next;
} E[maxm];
int source, sink, tar, maxDay, nv; const int inf = 0x3f3f3f3f; int cur[maxn], ps[maxn], dep[maxn]; void addEdge(int u, int v, int c) {
E[id].u = u; E[id].v = v;
E[id].c = c; E[id].next = head[u];
head[u] = id++; E[id].u = v; E[id].v = u;
E[id].c = 0; E[id].next = head[v];
head[v] = id++;
} void getMap() {
int i, j, u, v, p, s, e;
id = tar = maxDay = 0;
scanf("%d%d", &m, &n);
memset(head, -1, sizeof(head));
source = 0;
for(i = 1; i <= m; ++i) {
scanf("%d%d%d", &p, &s, &e);
tar += p;
if(e > maxDay) maxDay = e;
addEdge(source, i, p);
for(j = s; j <= e; ++j)
addEdge(i, m + j, 1);
}
sink = m + maxDay + 1; nv = sink + 1;
for(i = 1; i <= maxDay; ++i)
addEdge(m + i, sink, n);
} // 參数:顶点个数。源点,汇点
int Dinic(int n, int s, int t) {
int tr, res = 0;
int i, j, k, f, r, top;
while(true) {
memset(dep, -1, n * sizeof(int));
for(f = dep[ps[0] = s] = 0, r = 1; f != r; )
for(i = ps[f++], j = head[i]; j != -1; j = E[j].next) {
if(E[j].c && -1 == dep[k=E[j].v]) {
dep[k] = dep[i] + 1; ps[r++] = k;
if(k == t) {
f = r; break;
}
}
}
if(-1 == dep[t]) break; memcpy(cur, head, n * sizeof(int));
for(i = s, top = 0; ; ) {
if(i == t) {
for(k = 0, tr = inf; k < top; ++k)
if(E[ps[k]].c < tr) tr = E[ps[f=k]].c;
for(k = 0; k < top; ++k)
E[ps[k]].c -= tr, E[ps[k]^1].c += tr;
res += tr; i = E[ps[top = f]].u;
}
for(j = cur[i]; cur[i] != -1; j = cur[i] = E[cur[i]].next)
if(E[j].c && dep[i] + 1 == dep[E[j].v]) break;
if(cur[i] != -1) {
ps[top++] = cur[i];
i = E[cur[i]].v;
} else {
if(0 == top) break;
dep[i] = -1; i = E[ps[--top]].u;
}
}
}
return res;
} void solve(int cas) {
printf("Case %d: %s\n\n", cas, tar == Dinic(nv, source, sink) ? "Yes" : "No");
} int main() {
// freopen("stdin.txt", "r", stdin);
int t, cas;
scanf("%d", &t);
for(cas = 1; cas <= t; ++cas) {
getMap();
solve(cas);
}
return 0;
}

HDU3572 Task Schedule 【最大流】的更多相关文章

  1. HDU3572 Task Schedule(最大流+构图思维)

    题意: 有N个任务M个机器,给每个任务i完成所花费的时间Pi且每个任务要在第Si天后开始,在第Ei天前结束,保证任务在(S,E)之间一定能完成. 每个机器在一天里只能运行一个任务,一个任务可以在中途更 ...

  2. HDU 3572 Task Schedule (最大流)

    C - Task Schedule Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  3. HDU3572:Task Schedule【最大流】

    上了一天课 心塞塞的 果然像刘老师那么说 如果你有挂科+4级没过 那基本上是WF队 题目大意:有时间补吧 思路:给每个任务向每个时间点连边容量为1 每个时间点向汇点连边 容量为机器的个数 源点向每个任 ...

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

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

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

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

  6. hdu 3572 Task Schedule(最大流&amp;&amp;建图经典&amp;&amp;dinic)

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

  7. hdu 3572 Task Schedule

    Task Schedule 题意:有N个任务,M台机器.每一个任务给S,P,E分别表示该任务的(最早开始)开始时间,持续时间和(最晚)结束时间:问每一个任务是否能在预定的时间区间内完成: 注:每一个任 ...

  8. hdu 3572 Task Schedule (dinic算法)

    pid=3572">Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  9. HDU3572Task Schedule(最大流 ISAP比較快)建图方法不错

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

随机推荐

  1. [Everyday Mathematics]20150127

    设 $f,g:[a,b]\to [0,\infty)$ 连续, 单调递增, 并且 $$\bex \int_a^x \sqrt{f(t)}\rd t\leq \int_a^x \sqrt{g(t)}\r ...

  2. UVA 10529-Dumb Bones(概率dp)

    题意: 给出放一个多米诺骨牌,向左向右倒的概率,求要放好n个骨牌,需要放置的骨牌的期望次数. 分析: 用到区间dp的思想,如果一个位置的左面右面骨牌都已放好,考虑,放中间的情况, dp[i]表示放好前 ...

  3. 配置Tomcat以指定的身份(非root)运行

    本文依赖的环境: CentOS(大部分内容适用于其他Linux发行版) 已安装并配置好JVM环境 已安装并配置好gcc.make等编译工具 1. 下载Tomcat安装包并解压缩 cd /optwget ...

  4. Junit3.8 Stack测试

    package test; public class MyStack { private String[] elements; private int nextIndex; public MyStac ...

  5. COS回应7大质疑

    Apple过于封闭,没啥朋友,这家伙应该比较高傲,曾和Intel,IBM and so on..一起玩过!Google过于开放,狐朋狗友,友人泛滥,殃及ecosystem,弊端已显,祸水将至.COS奉 ...

  6. 你真的了解一段Java程序的生命史吗

    作为一名程序猿 ,我们每天都在写Code,但你真的了解它的生命周期么?今天就来简单聊下它的生命历程,说起一段Java Code,从出生到game over大体分这么几步:编译.类加载.运行.GC. 编 ...

  7. HDU 5778 abs (枚举)

    abs 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5778 Description Given a number x, ask positive ...

  8. Java线程池学习

    Java线程池学习 Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java ...

  9. TTL电平、CMOS电平、RS232电平的区别

    工作中遇到一个关于电平选择的问题,居然给忘记RS232电平的定义了,当时无法反应上来,回来之后查找资料才了解两者之间的区别,视乎两年多的时间,之前非常熟悉的一些常识也开始淡忘,这个可不是一个好的现象. ...

  10. Session,Cookie 和local storage的区别

    以前从没有听说过local storage, 在网上查了一些资料,得到如下结论 从存储位置看,分为服务器端存储和客户端存储两种 服务器端: session 浏览器端: cookie, localSto ...