#include<stdio.h>
#include<string.h>
#define N 1025
int n,m,cnt;
int map[N][N],vis[N],match[N],num[N];
int dfs(int x)
{
int i;
for(i=0;i<cnt;i++)
{
if(!vis[num[i]]&&map[x][num[i]])
{
vis[num[i]]=1;
if(match[num[i]]==-1||dfs(match[num[i]]))
{
match[num[i]]=x;
return 1;
}
}
}
return 0;
}
int solve()
{
int i,ans=0;
memset(match,-1,sizeof(match));
for(i=0;i<cnt;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(num[i]))
ans++;
}
return ans;
}
int main()
{
char st[100];
int use[1025],res1,res2,i,j,c;
while(~scanf("%d%d",&n,&m))
{
cnt=0;
memset(num,0,sizeof(num));
memset(use,0,sizeof(use));
memset(map,0,sizeof(map));
if(n==0&&m==0)
break;
while(m--)
{
scanf("%s",st);
res1=0;res2=0;
for(i=0;i<n;i++)
{
res1<<=1;
res2<<=1;
if(st[i]=='*')
{
res1+=0;
res2+=1;
}
else
{
res1+=st[i]-'0';
res2+=st[i]-'0';
}
}
if(!use[res1])
{
use[res1]=1;
num[cnt++]=res1;
}
if(!use[res2])
{
use[res2]=1;
num[cnt++]=res2;
}
}
for(i=0;i<cnt;i++)
for(j=0;j<cnt;j++)
{
c=num[i]^num[j];
if(c&&(c&(c-1))==0)
map[num[i]][num[j]]=1;
}
printf("%d\n",cnt-solve()/2);
}
}
poj 2724 二分图匹配
最新推荐文章于 2021-10-27 10:20:18 发布