#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N = 120000+20;
int n;
int size,head[N],dis[N],gap[N],pre[N],cur[N];
int mm[(1<<12)];
struct edge
{
int v,w,next;
edge(){}
edge(int v,int next,int w=0):v(v),next(next),w(w){}
}E[N*30];
inline void insert(int u,int v,int w)
{
E[size]=edge(v,head[u],w);
head[u]=size++;
E[size]=edge(u,head[v],0);
head[v]=size++;
}
int ISAP(int src,int des)
{
int maxflow=0;
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
for(int i=0;i<=n;i++)
cur[i]=head[i];
int u =pre[src]=src;
int aug=-1;
while(dis[src]<n)
{
loop: for(int &i=cur[u];i!=-1;i=E[i].next)
{
int v=E[i].v;
if(E[i].w && dis[u]==dis[v]+1)
{
aug=min(aug,E[i].w);
pre[v]=u;
u=v;
if(v==des)
{
maxflow+=aug;
for(u=pre[u];v!=src;v=u,u=pre[u])
{
E[cur[u]].w-=aug;
E[cur[u]^1].w+=aug;
}
aug=INT_MAX;
}
goto loop;
}
}
int mdis=n;
for(int i=head[u];i!=-1;i=E[i].next)
{
int v=E[i].v;
if(E[i].w && mdis>dis[v])
{
cur[u]=i;
mdis=dis[v];
}
}
if((--gap[dis[u]])==0)
break;
gap[dis[u]=mdis+1]++;
u=pre[u];
}
return maxflow;
}
int in()
{
char ch;
int a = 0;
while((ch = getchar()) == ' ' || ch == '\n');
a += ch - '0';
while((ch = getchar()) != ' ' && ch != '\n')
{
a *= 10;
a += ch - '0';
}
return a;
}
int main()
{
int m,a,b;
while(scanf("%d %d",&n,&m)==2)
{
size=0;
memset(head,-1,sizeof(head));
memset(mm,0,sizeof(mm));
for(int i=0;i<n;i++)
{
int t=0;
for(int j=0;j<m;j++)
{
a=in();
if(a) t|=(1<<j);
}
mm[t]++;
}
int nn=(1<<m),s=1,T=nn+m+2;
int n1=n;
n=T;
for(int i=1;i<nn;i++)
{
if(mm[i]==0) continue;
insert(s,i+2,mm[i]);
for(int j=0;j<m;j++)
{
if(i&(1<<j))
insert(i+2,j+nn+2,mm[i]);
}
}
for(int i=0;i<m;i++)
{
scanf("%d",&b);
insert(i+nn+2,T,b);
}
if(ISAP(s,T)>=n1)
puts("YES");
else puts("NO");
}
return 0;
}
tjut 3605
最新推荐文章于 2019-01-27 21:10:00 发布