题目链接:
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 */