#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++;
else
return 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;
}
HDU 3605(多重最大匹配)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.