POJ1698 Alice's Chance(最大匹配)

来源:互联网 发布:mac驱动下载 编辑:程序博客网 时间:2024/05/17 21:57

题目大意:

Alice要拍N部电影,一天只能拍一部

每部电影规定在星期几拍摄,要在W个星期内拍D次

问Alice是否可以拍完所有电影


这道题目关键是构图,可以用最大流做

由于我只会isap,写起来太麻烦,所以选择用好写的最大匹配做

当然时间效率上慢了非常多

最大匹配的基本思路是:

拍电影的总次数构成一个集合,每一个日期构成一个集合

若电影可以在某个日期拍摄则连起来,最后构成一个二分图


#include <stdio.h>#include <string.h>int xn,yn;int line[1005][355];int match[1005];int used[1005];int dfs(int u){int v;for(v=1;v<=yn;v++)if(line[u][v]&&!used[v]){used[v]=1;if(!match[v]||dfs(match[v])){match[v]=u;return 1;}}return 0;}int main(){int i,j,k,t,n,d,w,f[7],ans;scanf("%d",&t);while(t--){memset(match,0,sizeof(match));memset(line,0,sizeof(line));yn=ans=0;xn=1;scanf("%d",&n);while(n--){for(i=0;i<7;i++)scanf("%d",&f[i]);scanf("%d%d",&d,&w);for(i=xn;i<xn+d;i++)for(j=0;j<w;j++)for(k=1;k<=7;k++)if(f[k-1])line[i][k+j*7]=1;xn+=d;yn=7*w>yn?7*w:yn;}for(i=1;i<xn;i++){if(dfs(i))ans++;memset(used,0,sizeof(used));}if(ans==xn-1)printf("Yes\n");elseprintf("No\n");}return 0;}


0 0
原创粉丝点击