Hdu 3572Task Schedule

題意:

有M個機器,有N個任務。每個任務必須在Si 或者以後開始做,在Ei 或者之前完成,完成任務必須處理Pi 個時間單位。其中,每個任務可以在任意(空閒)機器上工作,每個機器的同一時刻只能工作一個任務,每個任務在同一時刻只能被一個機器工作,而且任務做到一半可以打斷,拿去其他機器做。問:能否在規定時間內把任務做完。

源點與每個任務都連一條邊,容量爲要求的天數p,然後每個任務都與相應的時間點連邊,邊容量爲1,每個時間點與匯點之間連邊,邊容量爲m,爲機器數(表示每個時間點最多可以有m臺機器處理任務),判斷滿流即可

代碼

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define For(i,j,k) for(int i=(j);i<=(int)k;i++)
#define Forr(i,j,k) for(int i=(j);i>=(int)k;i--)
#define Rep(i,u) for(int i=Begin[u],v=to[i];i;i=Next[i],v=to[i])
#define Set(a,b) memset(a,b,sizeof(a))
const int N=1001,M=100001,INF=0x3f3f3f3f;
using namespace std;
template <class T> inline void read(T &x){
    x=0;char c=getchar();int f(0);
    while(c<'0'||c>'9')f|=(c=='-'),c=getchar();
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
    x=f?-x:x;
}
template <class T>inline void chkmin(T &a,T b){a=a>b?b:a;}
template <class T>inline void chkmax(T &a,T b){a=a<b?b:a;}

int Begin[N],to[M<<1],Next[M<<1],f[M<<1],e=1,n,m;
inline void add(int x,int y,int z){
    to[++e]=y,Next[e]=Begin[x],Begin[x]=e,f[e]=z;
}
struct isap{
    int s,t,gap[N],d[N],p[N],cur[N];
    #define Retr(u) for(u=t;u^s;u=to[p[u]^1])
    inline void init(){
        queue<int>q;
        For(i,0,t)d[i]=INF,cur[i]=Begin[i],gap[i]=0;
        d[t]=0;gap[0]=1;
        q.push(t);
        while(!q.empty()){
            int r=q.front();q.pop();
            Rep(i,r)
                if(f[i^1]&&d[v]>d[r]+1)
                    ++gap[d[v]=d[r]+1],q.push(v);
        }
    }
    inline int Augment(){
        int u,a=INF;
        Retr(u)chkmin(a,f[p[u]]);
        Retr(u)f[p[u]]-=a,f[p[u]^1]+=a;
        return a;
    }
    inline int Maxflow(int _s,int _t){
        int i,u=s=_s,flow=0;t=_t;
        init();
        while(d[s]<t){
            if(u==t)flow+=Augment(),u=s;
            for(i=cur[u];i;i=Next[i])
                if(f[i]&&d[to[i]]+1==d[u])break;
            if(!i){
                if(--gap[d[u]]==0)break;
                d[u]=n;cur[u]=Begin[u];
                Rep(i,u)
                    if(f[i])chkmin(d[u],d[v]+1);
                ++gap[d[u]];
                if(u!=s)u=to[p[u]^1];
            }else cur[u]=i,p[u=to[i]]=i;
        }
        return flow;
    }
}F;
int P[N],S[N],E[N],s_,t_,sum;
inline void work(){
    Set(Begin,0),e=1,s_=sum=0;
    read(n),read(m);
    For(i,1,n){
        read(P[i]),read(S[i]),read(E[i]);
        sum+=P[i];
        chkmax(s_,E[i]);
    }
    s_+=n+1;t_=s_+1;
    For(i,1,n){
        add(s_,i,P[i]),add(i,s_,0);
        For(j,S[i],E[i])
            add(i,j+n,1),add(j+n,i,0);
    }
    For(i,1+n,s_-1)
        add(i,t_,m),add(t_,i,0);
}
int main(){
    int T;
    read(T);
    For(i,1,T){
        work();
        printf("Case %d: %s\n",i,F.Maxflow(s_,t_)==sum?"Yes":"No");
        puts("");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章