hdoj 3572 Task Schedule【建立超级源点超级汇点】
Task Schedule
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6000 Accepted Submission(s):
1922
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.
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.
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.
- #include<stdio.h>
- #include<string.h>
- #include<queue>
- #include<stack>
- #include<algorithm>
- #define INF 0x7fffff
- #define MAX 11000
- #define MAXM 1001000
- using namespace std;
- struct node
- {
- int from,to,cap,flow,next;
- }edge[MAXM];
- int ans,head[MAX];
- int cur[MAX];
- int vis[MAX];
- int dis[MAX];
- int sum,n,m;
- int sec;//超级汇点
- void init()
- {
- ans=0;
- memset(head,-1,sizeof(head));
- }
- void add(int u,int v,int w)
- {
- node E1={u,v,w,0,head[u]};
- edge[ans]=E1;
- head[u]=ans++;
- node E2={v,u,0,0,head[v]};
- edge[ans]=E2;
- head[v]=ans++;
- }
- void getmap()
- {
- int i,j,last=-1;
- sum=sec=0;
- int bt,et,time;
- for(i=1;i<=n;i++)
- {
- scanf("%d%d%d",&time,&bt,&et);
- sum+=time;
- add(0,i,time);//超级源点连接第i件任务
- for(j=bt;j<=et;j++)
- add(i,n+j,1);//将每件任务与完成这件任务所需要的时间段内的每一天连接
- last=max(last,et);
- }
- sec=n+last+1;
- for(i=1;i<=sec;i++)
- add(n+i,sec,m);//将所有的时间段内的点指向超级汇点
- }
- int bfs(int beg,int end)
- {
- int i;
- memset(vis,0,sizeof(vis));
- memset(dis,-1,sizeof(dis));
- queue<int>q;
- while(!q.empty())
- q.pop();
- vis[beg]=1;
- dis[beg]=0;
- q.push(beg);
- while(!q.empty())
- {
- int u=q.front();
- q.pop();
- for(i=head[u];i!=-1;i=edge[i].next)//遍历所有的与u相连的边
- {
- node E=edge[i];
- if(!vis[E.to]&&E.cap>E.flow)//如果边未被访问且流量未满继续操作
- {
- dis[E.to]=dis[u]+1;//建立层次图
- vis[E.to]=1;//将当前点标记
- if(E.to==end)//如果当前点搜索到终点则停止搜索 返回1表示有从原点到达汇点的路径
- return 1;
- q.push(E.to);//将当前点入队
- }
- }
- }
- return 0;//返回0表示未找到从源点到汇点的路径
- }
- int dfs(int x,int a,int end)//把找到的这条边上的所有当前流量加上a(a是这条路径中的最小残余流量)
- {
- //int i;
- if(x==end||a==0)//如果搜索到终点或者最小的残余流量为0
- return a;
- int flow=0,f;
- for(int& i=cur[x];i!=-1;i=edge[i].next)//i从上次结束时的弧开始
- {
- node& E=edge[i];
- if(dis[E.to]==dis[x]+1&&(f=dfs(E.to,min(a,E.cap-E.flow),end))>0)//如果
- {//bfs中我们已经建立过层次图,现在如果 dis[E.to]==dis[x]+1表示是我们找到的路径
- //如果dfs>0表明最小的残余流量还有,我们要一直找到最小残余流量为0
- E.flow+=f;//正向边当前流量加上最小的残余流量
- edge[i^1].flow-=f;//反向边
- flow+=f;//总流量加上f
- a-=f;//最小可增流量减去f
- if(a==0)
- break;
- }
- }
- return flow;//所有边加上最小残余流量后的值
- }
- int Maxflow(int beg,int end)
- {
- int flow=0;
- while(bfs(beg,end))//存在最短路径
- {
- memcpy(cur,head,sizeof(head));//复制数组
- flow+=dfs(beg,INF,end);
- }
- return flow;//最大流量
- }
- int main()
- {
- int t;
- scanf("%d",&t);
- int k=1;
- while(t--)
- {
- scanf("%d%d",&n,&m);
- init();
- getmap();
- printf("Case %d: ",k++);
- if(sum==Maxflow(0,sec))
- printf("Yes\n\n");
- else
- printf("No\n\n");
- }
- return 0;
- }
hdoj 3572 Task Schedule【建立超级源点超级汇点】的更多相关文章
- hdu 3572 Task Schedule (dinic算法)
pid=3572">Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- 图论--网络流--最大流 HDU 3572 Task Schedule(限流建图,超级源汇)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
- 解题报告:hdu 3572 Task Schedule(当前弧优化Dinic算法)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
- 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(拆点+最大流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 (最大流)
C - Task Schedule Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- hdu 3572 Task Schedule
Task Schedule 题意:有N个任务,M台机器.每一个任务给S,P,E分别表示该任务的(最早开始)开始时间,持续时间和(最晚)结束时间:问每一个任务是否能在预定的时间区间内完成: 注:每一个任 ...
- hdu 3572 : Task Schedule (网络流)
题目链接 题意: 有M个机器,N个任务 对第i个任务,需要在[Si,Ei]这段时间内恰有Pi天被process 每天最多有M个机器同时工作 每一天,一个任务若被process,那么它恰占用一个机器. ...
随机推荐
- spring IOC源码分析(2)
refresh这个方法包含了整个BeanFactory初始化的过程,定位资源由obtainFreshBeanFactory()来完成, protected ConfigurableListableBe ...
- 如何学习C++[转]
关于学C++, 我向你推荐一些书(当然能够结合课内项目实践更好) 1.The C++ Programming Language(Bjarne Stroustrup)2. Inside The C++ ...
- r个有标志的球放进n个不同的盒子里,要求无一空盒,问有多少种不同的分配方案?
由题意可知道r>=n,我原来想的是先取n个全排列,剩下的r-n个每个有n中选择,所以结果是n!*n^(r-n).经满神猜测,这样是会重复的.比如说,1到5个球,ABC三个盒子,ms ...
- 对话 Jessica Hamrick:和 Django 的情缘是我前行的动力
本文出自 Your Django Story 系列,该系列主要突出那些贡献 Django 的女性.点击查看更多,本文系 OneAPM 工程师编译整理. Jess Hamrick 是加州大学伯克利分校心 ...
- ZOJ 2750 Idiomatic Phrases Game(Dijkstra)
点我看题目 题意 : 给定一本字典,字典里有很多成语,要求从字典里的第一个成语开始,运用字典里的成语变到最后一个成语,变得过程就是成语接龙,后一个成语的第一个字必须有前一个成语的最后一个字相等,给定的 ...
- android一个纠结的VFY错误
08-16 09:06:45.018: W/dalvikvm(2286): VFY: unable to resolve static method 3273: Lorg/slf4j/LoggerFa ...
- php数组遍历 使用while循环
while() 通常和 list(),each()配合使用. $colors= array('red','blue','green','yellow'); while(list($key,$val)= ...
- 基于msys2工具集,自编译gcc-6.2.0、Qt-5.6.1-1和Qt-4.8.7(有nuwen.net网站提供的脚本)
好久没更新(其实大可不要经常更新吧),一直都是用Qt4,最近想着转向Qt5了,msys2是自带Qt的,但工具链经常会更新,依赖也较多,简便才方便,做了最后一组Qt工具的更新,如题,Qt-4.8.7作为 ...
- Android java.lang.ClassCastException
lassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误.下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法. 这种 ...
- (转载)NET流操作
http://www.oseye.net/user/kevin/blog/86 概念 数据流(Stream)是对串行传输数据的一种抽象表示,是对输入/输出的一种抽象.数据有来源和目的地,衔接两者的就是 ...