http://acm.hdu.edu.cn/showproblem.php?pid=3572
題意:給出n個任務+m台機器,還有一個任務處理時限+開始時間+結束時間,一個時刻裡一台機器只能處理一個任務,但是一個任務可以在不同機器處理,問能否處理完所有任務?
方法:最大流。這個題的建圖算是經典,因為限定每個時刻每台機器只能處理一個任務,所以可以把時間點分配給各個合法的機器...具體是先設定一個超級源點S,連向各個任務,容量為該任務所需時間,各個任務連向在範圍內的時間點,容量為1(保證每個時刻xxx這個條件),所有時間點連向超級匯點T,容量為機器台數,最後求最大流,等於所有機器所需時間和的就是yes,模板用dinic這裡省去了~
#define M 1005struct node { int u, v, next, cap;} edge[M*M];int next[M], head[M], layer[M], Q[M * 2], mark[M];int ecnt;void init(){ ecnt= 0; memset(head,-1,sizeof(head));}void add(int u, int v, int c) { edge[ecnt].u = u; edge[ecnt].v = v; edge[ecnt].cap = c; edge[ecnt].next = head[u]; head[u] = ecnt++; edge[ecnt].u = v; edge[ecnt].v = u; edge[ecnt].cap = 0;////////// edge[ecnt].next = head[v]; head[v] = ecnt++;}int main(){ int ca; scanf("%d",&ca); int cc = 1; while(ca--){ int n,m; scanf("%d%d",&n,&m); int i,j; int sum = 0; init(); int s = 0,t = 500+n+1; for(i=1;i<=n;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); sum += x; add(s,i,x); for(j=y;j<=z;j++){ add(i,j+n,1); } } for(i=1;i<=500;i++){ add(i+n,t,m); } int ans = Dinic_flow(s,t); printf("Case %d: ",cc++); if(ans!=sum)printf("No\n\n"); else printf("Yes\n\n"); } return 0;}