【最大流】XMU 1595 机器调度

题目链接:

  http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1595

题目大意

  T组数据,n个任务,m个机器,对于每个任务:有一个处理时间p(表示这个任务需要机器工作p天才能完成),一个释放时间r(表示该任务需要从第r天开始才能被处理),一个完成时间d(表示在第d天之前该任务必须完成)保证:d >= p + r。一个任务同一时间只能在一个机器上运行,但是运行时可以被中断,并移到另一个机器上运行。对于每台机器:在同一时间最多只能处理一个任务,在不同的时间可以处理不同的任务。问是否存在一个调度方案,使得所有任务均可以顺利完成?

题目思路:

  【最大流】

  没看出来是网络流问题。

  将任务和该任务能运行的时间连边,S到任务连处理时间,时间到T连可运行机器数。

  N个任务看成N个节点,对于每个时间夜也抽象成节点,然后设源和汇

  源到任务节点连边,容量为该任务的时间,任务到每个可操作的时间节点连边,容量就是1,最后每个时间节点到汇点连边,容量为机器数量

  最后求解最大流,若最大流=所有任务的总时间,则有解。

 

 

  1 //
  2 //by coolxxx
  3 //
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<string>
  7 #include<iomanip>
  8 #include<memory.h>
  9 #include<time.h>
 10 #include<stdio.h>
 11 #include<stdlib.h>
 12 #include<string.h>
 13 #include<stdbool.h>
 14 #include<math.h>
 15 #define min(a,b) ((a)<(b)?(a):(b))
 16 #define max(a,b) ((a)>(b)?(a):(b))
 17 #define abs(a) ((a)>0?(a):(-(a)))
 18 #define lowbit(a) (a&(-a))
 19 #define sqr(a) ((a)*(a))
 20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
 21 #define eps 1e-8
 22 #define J 10
 23 #define MAX 0x7f7f7f7f
 24 #define PI 3.1415926535897
 25 #define inf 10000000
 26 #define N 504
 27 #define M 50004
 28 using namespace std;
 29 int n,m,lll,ans,cas;
 30 int nn,fl,s,t;
 31 int last[N],d[N],vd[N];
 32 struct xxx
 33 {
 34     int next,e,q;
 35 }a[M];
 36 void add(int x,int y,int z)
 37 {
 38     a[++lll].next=last[x];
 39     a[lll].e=y;
 40     a[lll].q=z;
 41     last[x]=lll;
 42 }
 43 int sap(int u,int f)
 44 {
 45     int i,v,tt,asp=0,mix=nn-1;
 46     if(u==t)return f;
 47     for(i=last[u];i!=0;i=a[i].next)
 48     {
 49         v=a[i].e;
 50         if(a[i].q>0)
 51         {
 52             if(d[u]==d[v]+1)
 53             {
 54                 tt=sap(v,min(f-asp,a[i].q));
 55                 asp+=tt;
 56                 a[i].q-=tt;
 57                 a[i^1].q+=tt;
 58                 if(asp==f || d[s]==nn)
 59                     return asp;
 60             }
 61             mix=min(mix,d[v]);
 62         }
 63     }
 64     if(asp!=0)return asp;
 65     if(!--vd[d[u]])d[s]=nn;
 66     else vd[d[u]=mix+1]++;
 67     return asp;
 68 }
 69 void build()
 70 {
 71     int i,j,x,y,z;
 72     s=100+200+1;t=100+200+2;
 73     nn=0;
 74     for(i=1;i<=n;i++)
 75     {
 76         scanf("%d%d%d",&x,&y,&z);
 77         fl+=x;nn=max(nn,z);
 78         add(s,i,x);add(i,s,0);
 79         for(j=y;j<z;j++)
 80         {
 81             add(i,n+j,1);add(n+j,i,0);
 82         }
 83     }
 84     for(i=1;i<=nn;i++)
 85     {
 86         add(n+i,t,m);add(t,n+i,0);
 87     }
 88     nn+=n+2;
 89     vd[0]=nn;
 90 }
 91 int main()
 92 {
 93     #ifndef ONLINE_JUDGE
 94 //    freopen("1.txt","r",stdin);
 95 //    freopen("2.txt","w",stdout);
 96     #endif
 97     int i,j,k,l,f;
 98 //    while(~scanf("%s",s1))
 99 //    while(~scanf("%d",&n))
100     for(scanf("%d",&cas),l=1;l<=cas;l++)
101     {
102         fl=ans=0;lll=1;
103         memset(d,0,sizeof(d));
104         memset(vd,0,sizeof(vd));
105         memset(last,0,sizeof(last));
106         scanf("%d%d",&n,&m);
107         build();
108         while(d[s]<nn)
109         {
110             f=sap(s,MAX);
111             ans+=f;
112         }
113         if(ans==fl)puts("Yes");
114         else puts("No");
115     }
116     return 0;
117 }
118 
119 /*
120 //
121 
122 //
123 */
View Code

 

posted @ 2016-05-08 10:07  Cool639zhu  阅读(630)  评论(0编辑  收藏  举报