poj 1698 Alice's Chance

这个是多重匹配啊??? = =。。。无语了。。

 

可以用最大流做,把电影当成源点,输出电影天数的流,每一天连接流量为1作为汇点,然后就是多汇源的问题了。。最后看汇点流量是否等于源点流量即可。

 

我用匹配做的,直接把电影按需要的天数拆点,然后点与可以拍摄的日期连线,求最大匹配即可。判断最大匹配是否等于总共需要的天数即可。

 

电影拆点后最多可达到 20*50个点。。所以数组不要开小了。。

 

#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> #define MAX 410 using namespace std; int week[10]; int map[1100][MAX]; int used[1100],mat[1100]; int Augment(int x,int n) { int i; for(i=1; i<=n; i++) if( !used[i] && map[x][i] ) { used[i] = 1; if( !mat[i] || Augment(mat[i],n) ) { mat[i] = x; return 1; } } return 0; } int Hungary(int n,int m) { int i,sum = 0; memset(mat,0,sizeof(mat)); for(i=1; i<=n; i++) { memset(used,0,sizeof(used)); if( Augment(i,m) ) sum++; } return sum; } int main() { int ncases,n; int i,j,k,p,D,W,beg,maxw,sum; scanf("%d",&ncases); while( ncases -- ) { beg = 1; maxw = sum = 0; memset(map,0,sizeof(map)); scanf("%d",&n); for(i=1; i<=n; i++) { for(j=1; j<=7; j++) scanf("%d",&week[j]); scanf("%d%d",&D,&W); for(j=beg; j<beg+D; j++) for(k=1; k<=7; k++) if( week[k] == 1 ) for(p=0; p<W; p++) map[j][k+p*7] = 1; beg += D; sum += D; if( W*7 > maxw ) maxw = W*7; } int ans = Hungary(beg-1,maxw); if( ans != sum ) printf("No/n"); else printf("Yes/n"); } return 0; }  

你可能感兴趣的:(poj 1698 Alice's Chance)