hdu 3572 Task Schedule(最大流&&建图经典&&dinic)
Task Schedule
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5550 Accepted Submission(s): 1786
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.
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.
Print a blank line after each test case.
4 3
1 3 5
1 1 4
2 3 7
3 5 9
2 2
2 1 3
1 2 2
Case 2: Yes
题意:有M个机器。有N个任务。
每一个任务必须在Si
或者以后開始做,在Ei 或者之前完毕,完毕任务必须处理Pi 个时间单位。
当中,每一个任务能够在随意(空暇)机器上工作。每一个机器的同一时刻仅仅能工作一个任务,
每一个任务在同一时刻仅仅能被一个机器工作,并且任务做到一半能够打断,拿去其它机器做。
问:是否能在规定时间内把任务做完。
思路:这题最大流最基本的就是建图。
刚開始学最大流的仅仅会模板的我果断不知道怎么建图。參考大神思路:
直接把0作为源点。最小的開始时间到最大的结束时间作为任务,0到任务的权值为机器个数;
从最大结束时间到它乘以2作为天数,每一个任务连范围内的全部时间点,权值为1,
最大结束时间乘以2加1作为汇点。每一个时间点到汇点权值为机器个数。判满流。
Dinic
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
#define M 1100
#define inf 0x3f3f3f3f
int head[M],dis[M];
int n,m,t,cnt;
struct node{
int u,v,next,w;
}mp[M*M];
void add(int u,int v,int w){//邻接表
mp[cnt].u=u;
mp[cnt].v=v;
mp[cnt].w=w;
mp[cnt].next=head[u];
head[u]=cnt++;
mp[cnt].u=v;//反向边
mp[cnt].v=u;
mp[cnt].w=0;
mp[cnt].next=head[v];
head[v]=cnt++;
}
int bfs(){
int s=0;
memset(dis,-1,sizeof(dis));
queue <int> q;
while(!q.empty()) q.pop();
dis[s]=0;
q.push(s);
while(!q.empty()){
s=q.front();
q.pop();
for(int i=head[s];i!=-1;i=mp[i].next){
int v=mp[i].v;
if(dis[v]==-1&&mp[i].w){
dis[v]=dis[s]+1;
if(v==t) return 1;//假设搜到汇点直接结束函数
q.push(v);
}
}
}
return 0;
}
int dfs(int s,int low){
if(s==t) return low;
int a,i,ans=0;
for(i=head[s];i!=-1;i=mp[i].next){
int v=mp[i].v;
if(mp[i].w && dis[v]==dis[s]+1 && (a=dfs(v,min(low,mp[i].w))) ){
mp[i].w-=a;
mp[i^1].w+=a;//反向边
ans+=a;//这两行是速度优化 ,我试了非常多次。写的话200多MS,
if(ans==low) break;//不写的话就超时
}
}
return ans;
}
int main(){
int T,i,j,t1,t2,sum,cas=1;
int s[505],e[505],q[505];
scanf("%d",&T);
while(T--){
sum=0; t1=inf; t2=-1;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d%d%d",&q[i],&s[i],&e[i]);
t1=min(s[i],t1);
t2=max(e[i],t2);
sum+=q[i];
}
memset(head,-1,sizeof(head));
cnt=0; t=t2*2+1;//t为超级汇点
for(i=t1;i<=t2;i++)
add(0,i,m);//超级源点0到每一个任务连线。每条线权值为机器个数
for(i=1;i<=n;i++){
for(j=s[i];j<=e[i];j++){
add(j,j+t2,1);//每一个任务和任务相关的每一天权值设为1
add(j+t2,t2*2+1,m);//每一天到汇点t2*2+1,设置成机器个数m。事实上这我也试了好多次。
// 设置成1,或者q每一个任务的持续的时间数,都能够AC,,好像不影响= =+
}
}
int ans=0,k;
while(bfs()){
while(k=dfs(0,inf))
ans+=k;
}
if(sum<=ans)//能完毕的话
printf("Case %d: Yes\n\n",cas++);
else printf("Case %d: No\n\n",cas++);
}
return 0;
}
hdu 3572 Task Schedule(最大流&&建图经典&&dinic)的更多相关文章
- HDU 3572 Task Schedule (最大流)
C - Task Schedule Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- hdu 3572 Task Schedule (dinic算法)
pid=3572">Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- HDU 3572 Task Schedule(拆点+最大流dinic)
Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu 3572 Task Schedule(最大流)2010 ACM-ICPC Multi-University Training Contest(13)——Host by UESTC
题意: 告诉我们有m个任务和k个机器.第i个任务需要ci天完成,最早从第ai天开始,最晚在第bi天结束.每台机器每天可以执行一个任务.问,是否可以将所有的任务都按时完成? 输入: 首行输入一个整数t, ...
- hdu 3572 Task Schedule【 最大流 】
求出最大流,再判断是否满流 先不理解为什么要这样建图 后来看了这一篇题解 http://blog.csdn.net/u012350533/article/details/12361003 把0看做源点 ...
- hdu 3572 Task Schedule
Task Schedule 题意:有N个任务,M台机器.每一个任务给S,P,E分别表示该任务的(最早开始)开始时间,持续时间和(最晚)结束时间:问每一个任务是否能在预定的时间区间内完成: 注:每一个任 ...
- 解题报告:hdu 3572 Task Schedule(当前弧优化Dinic算法)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
- HDU 3572 Task Schedule(ISAP模板&&最大流问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3572 题意:m台机器.须要做n个任务. 第i个任务.你须要使用机器Pi天,且这个任务要在[Si , ...
- hdu 3572 Task Schedule (Dinic模板)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
随机推荐
- HTTP协议1:工作原理
http://blog.csdn.net/huangjin0507/article/details/51678858 1. HTTP简介 HTTP协议(HyperText Transfer Proto ...
- 【JavaScript】JS将Java的Timestamp转为Date类型
遇到一个小需求,由于要填充日期插件里的数据,前台要把java后台传来的Date类型的数据转成YYYY-MM-DD格式的时间数据.通过json传输,Java的Date类型的数据自动转成了时间戳,例如 “ ...
- 具有jQuery背景的程序员如何转换为AngularJS思考模式(译)
最近一直在研究angularjs,最大的感受就是它和之前的jQuery以及基于jQuery的各种库设计理念完全不同,如果不能认识到这点而对于之前做jQuery开发的程序员,去直接学习angularjs ...
- noip 2016 day2 t1组合数问题
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- [USACO 2018 Open Gold] Tutorial
Link: 传送门 A: 对于每一条分割线,设本不应在其左侧的个数为$x$ 重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去 这样就转直接用树状数组求出最大的$x$即可 ...
- (原创)Stanford Machine Learning (by Andrew NG) --- (week 4) Neural Networks Representation
Andrew NG的Machine learning课程地址为:https://www.coursera.org/course/ml 神经网络一直被认为是比较难懂的问题,NG将神经网络部分的课程分为了 ...
- 1.1(JavaScript学习笔记)、JavaScript基础
一.JavaScript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型. 它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端 ...
- Educational Codeforces Round 9 B. Alice, Bob, Two Teams 前缀和
B. Alice, Bob, Two Teams 题目连接: http://www.codeforces.com/contest/632/problem/B Description Alice and ...
- HDU 4417 Super Mario(划分树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- winform窗体MaximizeBox
如果MaximizeBox为false会导致Form2窗体底部不显示. =>解决办法TopMost属性为true. Form2 _frm2 = new Form2(); _frm2.Maximi ...