大题思路:这道题可以另外的添加一个原点一个汇点,其中汇点需要处理一下,将每个任务和源点相连流量为完成的天数,
然后将任务和所控制完成的时间范围内的所有点相连,流量为1,最后就是所有的区间和汇点相连流量为机器的数目.
判断一下是否满流就可以.
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> #include<math.h> #define inf 0x3f3f3f3f #define ls l,mid,rt<<1 #define rs mid+1,r,rt<<1|1 #define maxn 10000000 using namespace std; struct node { int next,w,to; }q[1000000]; int head[1000000],l[1000000],s,e,cnt; void bu(int a,int b,int c) { q[cnt].to=b; q[cnt].w=c; q[cnt].next=head[a]; head[a]=cnt++; q[cnt].to=a; q[cnt].next=head[b]; q[cnt].w=0; head[b]=cnt++; } int bfs() { memset(l,-1,sizeof(l)); l[s]=0; queue<int >Q; while(!Q.empty()) Q.pop(); Q.push(s); while(!Q.empty()) { int v=Q.front(); Q.pop(); for(int i=head[v];~i;i=q[i].next) { if(l[q[i].to ]==-1&&q[i].w>0) { l[q[i].to ]=l[v]+1; Q.push(q[i].to); } } } return l[e]!=-1; } int dfs(int x,int f) { if(x==e||!f) { return f; } int a,tmp=0; for(int i=head[x];~i;i=q[i].next) { if( (l[q[i].to ]==l[x]+1)&&(q[i].w>0) ) { a=dfs(q[i].to,min(f-tmp,q[i].w) ); if(a>0 ) { q[i].w-=a; q[i^1].w+=a; tmp+=a; if(tmp==f) break; } //else // l[q[i].to]=-1; } } if(!tmp) l[x]=-1; return tmp; } int main() { int cla,p,i,j,k; int a,b,c,ma,n,m; scanf("%d",&cla); for(int gr=1;gr<=cla;gr++) { cnt=0; scanf("%d%d",&n,&m); memset(head,-1,sizeof(head)); ma=-1; s=0;int sum=0; for(i=1;i<=n;i++) { scanf("%d%d%d",&c,&a,&b); sum+=c; ma=max(ma,b); bu(s,i,c); for(j=a;j<=b;j++) bu(i,j+n,1); } e=ma+n+1; for(i=1;i<=ma;i++) bu(i+n,e,m); int ans=0; while(bfs()) { ans+=dfs(0,inf); } printf("Case %d: ",gr); if(ans>=sum) puts("Yes"); else puts("No"); printf("\n"); } return 0; }