HDU 3605(多重最大匹配)

来源:互联网 发布:知豆新能源汽车价格表 编辑:程序博客网 时间:2024/05/22 20:32
#include<stdio.h>#include<string.h>const int N=1e5+11,M=11;int a[N][M],match[M][N],cnt[M],cap[M],p[M];int n,m;inline void in(int &res){char c;while((c=getchar())<'0'||c>'9');res=c-'0';while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';}int dfs(int u){for(int i=1;i<=m;i++){if(a[u][i]&&!p[i]){p[i]=1;if(cnt[i]<cap[i]){match[i][++cnt[i]]=u;return 1;}else{for(int j=1;j<=cap[i];j++){if(dfs(match[i][j])){match[i][j]=u;return 1;}}}}}return 0;}int maxmatch(){memset(cnt,0,sizeof(cnt));memset(match,-1,sizeof(match));int ans=0;for(int i=1;i<=n;i++){memset(p,0,sizeof(p));if(dfs(i))ans++;elsereturn 0;}return ans;}int main(){while(scanf("%d%d",&n,&m)!=EOF){memset(a,0,sizeof(a));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){in(a[i][j]);}}for(int j=1;j<=m;j++)in(cap[j]);printf("%s\n",maxmatch()==n?"YES":"NO");}return 0;}

0 0