题意:
给出 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;
}