HDU 3572 Task Schedule 最大流判满流
2014-04-30 13:44
417 查看
Task Schedule
题意:
给出 N 件任务和 M台机器, 这N件任务都一个限制: 必须在 [S,E] 之间完成, 而且完成的时间不能超过 P.
一台机器每天只能做意见任务, 不过庆幸的是: 任务是可以拆分的, 比如一件任务要3天完成, 那么你就可以将呀拆分
成3份. 现在问: 在所有机器慢负荷运转的情况下, 如何分配这些任务使得在最后的期限时, 所有任务都能完成.
网络流无疑,关键是建立模型
建立超级源点和汇点,源点指向n个任务,权值为完成每个任务所需的天数
然后把每个任务拆成e-s+1份,然后分别指向从n+s~n+e这些点,权值为1
接着所有的天与汇点连边,权值为m,表示每天可以完成m份工作
题意:
给出 N 件任务和 M台机器, 这N件任务都一个限制: 必须在 [S,E] 之间完成, 而且完成的时间不能超过 P.
一台机器每天只能做意见任务, 不过庆幸的是: 任务是可以拆分的, 比如一件任务要3天完成, 那么你就可以将呀拆分
成3份. 现在问: 在所有机器慢负荷运转的情况下, 如何分配这些任务使得在最后的期限时, 所有任务都能完成.
网络流无疑,关键是建立模型
建立超级源点和汇点,源点指向n个任务,权值为完成每个任务所需的天数
然后把每个任务拆成e-s+1份,然后分别指向从n+s~n+e这些点,权值为1
接着所有的天与汇点连边,权值为m,表示每天可以完成m份工作
#include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <iostream> #include <sstream> #include <map> #include <set> #include <queue> #include <stack> #include <fstream> #include <numeric> #include <iomanip> #include <bitset> #include <list> #include <stdexcept> #include <functional> #include <utility> #include <ctime> using namespace std; #define PB push_back #define MP make_pair #define REP(i,n) for(int i=0;i<(n);++i) #define FOR(i,l,h) for(int i=(l);i<=(h);++i) #define DWN(i,h,l) for(int i=(h);i>=(l);--i) #define CLR(vis) memset(vis,0,sizeof(vis)) #define MST(vis,pos) memset(vis,pos,sizeof(vis)) #define MAX3(a,b,c) max(a,max(b,c)) #define MAX4(a,b,c,d) max(max(a,b),max(c,d)) #define MIN3(a,b,c) min(a,min(b,c)) #define MIN4(a,b,c,d) min(min(a,b),min(c,d)) #define PI acos(-1.0) #define INF 1000000000 #define LINF 1000000000000000000LL #define eps 1e-8 typedef long long ll; int n,m; const int mm=3*1e5; const int mn=3*1e5; int node,s,t,edge; int ver[mm],flow[mm],next[mm]; int head[mn],work[mn],dis[mn],q[mn]; struct rnode{ int p,s,e; }a[555]; void init(int _node,int _s,int _t) { node=_node, s=_s, t=_t; for(int i=0;i<node;++i) head[i]=-1; edge=0; } void addedge(int u,int v,int c) { ver[edge]=v,flow[edge]=c,next[edge]=head[u],head[u]=edge++; ver[edge]=u,flow[edge]=0,next[edge]=head[v],head[v]=edge++; } bool Dinic_bfs() { int i,u,v,l,r=0; for(i=0;i<node;++i) dis[i]=-1; dis[ q[r++]=s ] = 0; for(l=0;l<r;l++) { for(i=head[ u=q[l] ]; ~i ;i=next[i]) if(flow[i] && dis[ v=ver[i] ]<0) { dis[ q[r++]=v ]=dis[u]+1; if(v==t) return 1; } } return 0; } int Dinic_dfs(int u,int exp) { if(u==t) return exp; for(int &i=work[u],v,temp; ~i ;i=next[i]) { if(flow[i] && dis[ v=ver[i] ]==dis[u]+1 && ( temp=Dinic_dfs(v,min(exp,flow[i])) )>0) { flow[i]-=temp; flow[i^1]+=temp; return temp; } } return 0; } int Dinic_flow() { int ans=0,res,i; while(Dinic_bfs()) { for(i=0;i<node;++i) work[i]=head[i]; while( res=Dinic_dfs(s,INF) ) ans+=res; } return ans; } int main() { int cas; cin>>cas; FOR(cnt,1,cas) { cin>>n>>m; int maxflow=0; int maxday=0; CLR(a); FOR(i,1,n) { scanf("%d%d%d",&a[i].p,&a[i].s,&a[i].e); maxflow+=a[i].p; maxday=max(maxday,a[i].e); } init(n+maxday+2,0,n+maxday+1); FOR(i,1,n) { addedge(s,i,a[i].p); FOR(j,a[i].s,a[i].e) addedge(i,n+j,1); } FOR(i,1,maxday) addedge(i+n,t,m); int ans=Dinic_flow(); //cout<<ans<<endl; if(ans==maxflow) printf("Case %d: Yes\n\n", cnt); else printf("Case %d: No\n\n", cnt); } return 0; }
相关文章推荐
- HDU3572——Task Schedule (最大流判断满流)
- HDU 3572 Task Schedule(最大流判满流,SAP)
- HDU 3572 Task Schedule ([最大流]任务分配,判断满流)
- HDU 3572 Task Schedule(最大流判断满流)
- HDU 3572 Task Schedule(最大流)
- hdu 3572 Task Schedule(最大流)
- hdu 3572 Task Schedule(网络流最大流)
- HDU 3572 Task Schedule(最大流-Dinic)
- HDU 3572 Task Schedule(最大流)
- HDU 3572 Task Schedule(最大流)
- HDU - 3572 Task Schedule (最大流)
- hdu 3572 Task Schedule(最大流,判断满流+isap模版)
- 【HDU】3572 Task Schedule (最大流 ISAP算法)
- hdu 3572 Task Schedule(最大流)
- HDU_3572_Task Schedule(最大流)
- [HDU 3572]Task Schedule[最大流]
- hdu 3572 Task Schedule(最大流&&建图经典&&dinic)
- 【最大流】 HDU 3572 Task Schedule
- hdu 3572 Task Schedule(最大流&&建图经典&&dinic)
- hdu 3572 Task Schedule 最大流+建图+dinic入门