HDOJ 3572 - Task Schedule 读清题..简单的构图最大流
2013-08-30 11:56
531 查看
题意:
现在有 N(N<=500)个任务..有M(<=200)个机器..每个任务表示为(p,s,e)..代表这个任务要在s或者s之后开始做..在e或者e之前结束.这个任务要做p天..而每个任务不一定要连续的做,,,可以在s,e间不连续的天,不同天不一定要在同一台机器上完成...而对于一个机器来说..每天只能处理某一个任务..现在给出N,M..以及每个任务的(p,s,e)..问能否让所有的任务都顺利完成.
题解:
这题题意没理解错就简单..我开始就看成了一个任务一旦开始就只能在一台机器上做并且连续的坐..想了好久没思路...再读了题才发现没那么复杂...
每个机器往其(s,e)每个时间点做有向边,容量为1....超级源点向每个机器做有向边..容量为其p...每个时间点向超级汇点做边..容量为m...跑最大流..然后判断和超级源点向连的边是否全部满流..全部满流则Yes..否则No..
Program:
现在有 N(N<=500)个任务..有M(<=200)个机器..每个任务表示为(p,s,e)..代表这个任务要在s或者s之后开始做..在e或者e之前结束.这个任务要做p天..而每个任务不一定要连续的做,,,可以在s,e间不连续的天,不同天不一定要在同一台机器上完成...而对于一个机器来说..每天只能处理某一个任务..现在给出N,M..以及每个任务的(p,s,e)..问能否让所有的任务都顺利完成.
题解:
这题题意没理解错就简单..我开始就看成了一个任务一旦开始就只能在一台机器上做并且连续的坐..想了好久没思路...再读了题才发现没那么复杂...
每个机器往其(s,e)每个时间点做有向边,容量为1....超级源点向每个机器做有向边..容量为其p...每个时间点向超级汇点做边..容量为m...跑最大流..然后判断和超级源点向连的边是否全部满流..全部满流则Yes..否则No..
Program:
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<math.h> #include<queue> #define MAXN 1000005 #define MAXM 1000005 #define oo 1000000007 #define ll long long using namespace std; struct Dinic { struct node { int x,y,c,next; }line[MAXM]; int Lnum,_next[MAXN],dis[MAXN]; void initial(int n) { for (int i=0;i<=n;i++) _next[i]=-1; Lnum=-1; } void addline(int x,int y,int c) { line[++Lnum].next=_next[x],_next[x]=Lnum; line[Lnum].x=x,line[Lnum].y=y,line[Lnum].c=c; line[++Lnum].next=_next[y],_next[y]=Lnum; line[Lnum].x=y,line[Lnum].y=x,line[Lnum].c=0; } bool BFS(int s,int e) { queue<int> Q; while (!Q.empty()) Q.pop(); memset(dis,0,sizeof(dis)); dis[s]=1; Q.push(s); while (!Q.empty()) { int h,k; h=Q.front(),Q.pop(); if (h==e) return dis[e]; for (k=_next[h];k!=-1;k=line[k].next) if (line[k].c && !dis[line[k].y]) dis[line[k].y]=dis[h]+1,Q.push(line[k].y); } return false; } int dfs(int x,int flow,int e) { if (x==e) return flow; int temp,cost=0; for (int k=_next[x];k!=-1;k=line[k].next) if (line[k].c && dis[line[k].y]==dis[x]+1) { temp=dfs(line[k].y,min(flow-cost,line[k].c),e); if (temp) { line[k].c-=temp,line[k^1].c+=temp; cost+=temp; if (flow==cost) return cost; }else dis[line[k].y]=-1; } return cost; } int MaxFlow(int s,int e) { int MaxFlow=0; while (BFS(s,e)) MaxFlow+=dfs(s,oo,e); return MaxFlow; } }T; int main() { int C,n,m,i,cases,sum,S,E; scanf("%d",&C); for (cases=1;cases<=C;cases++) { scanf("%d%d",&n,&m); S=2000,E=S+1,T.initial(E),sum=0; for (i=1;i<=n;i++) { int p,s,e,t; scanf("%d%d%d",&p,&s,&e); sum+=p; T.addline(S,i,p); for (t=s;t<=e;t++) T.addline(i,t+n,1); } for (i=1;i<=500;i++) T.addline(i+n,E,m); printf("Case %d: ",cases); if (T.MaxFlow(S,E)==sum) printf("Yes\n\n"); else printf("No\n\n"); } return 0; }
相关文章推荐
- hdoj 3572 Task Schedule【最大流】
- HDU 3572 Task Schedule(最大流)
- 【最大流】 HDU 3572 Task Schedule
- hdu 3572 Task Schedule(最大流,判断满流+isap模版)
- hdoj 4183 Pahom on Water 【网络流 简单题】【dinic求最大流】
- HDU 3572 Task Schedule(最大流判断满流)
- HDOJ 1507 - Uncle Tom's Inherited Land* 构图做二分图最大匹配
- HDU - 3572 Task Schedule (最大流)
- 【最大流】 HDU 3572 Task Schedule
- hdoj 3572 Task Schedule
- hdu 3572 Task Schedule(最大流&&建图经典&&dinic)
- 【HDU】3572 Task Schedule (最大流 ISAP算法)
- HDOJ-3572 Task Schedule(网络流)
- hdu 3572 Task Schedule(最大流&&建图经典&&dinic)
- HDU 3572 Task Schedule 最大流判满流
- hdu 3572 Task Schedule(最大流)
- [最大流] hdu 3572 Task Schedule
- HDOJ 3277 - Marriage Match III 拆点构图最大流..偷了一个效率很好的Dinic....
- hdoj 3572 Task Schedule 【最大流 在时间区间建图判断是否满流】
- hdoj最大连续子序列 (简单dp)