Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 2573 | Accepted: 693 |
Description
One day, Mike's machine was infected. When Mike found out, he had already done some operations and the cheeses operated by this infected machine were infected too. He cleaned his machine as quickly as he could, and now he needs to clean the infected cheeses with the minimum number of operations. If a cheese is infected, cleaning this cheese with the machine one or more times will make this cheese free from virus again; but if a cheese is not infected, operation on this cheese will make it go bad.
Now given the infected operations Mike has done, you need to find out the minimum number of operations that must be performed to clean all the infected cheeses without making any clean cheese go bad.
Input
Output
Sample Input
3 3 *01 100 011 0 0
Sample Output
2
Source
#include<stdio.h>
#include<string.h>
int n,m,gx,gy;
bool f[1025];
int h[1025],link[1025];
bool mat[1025][1025];
bool can(int t)
{
for(int i=0;i<gy;i++)
if(f[i]==0&&mat[t][i])
{
f[i]=1;
if(link[i]==-1||can(link[i]))
{
link[i]=t;
return true;
}
}
return false;
}
int MaxMatch()
{
int num=0;
memset(link,-1,sizeof(link));
for(int i=0;i<gx;i++)
{
memset(f,0,sizeof(f));
if(can(i)) num++;
}
return num;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
gx=0,gy=0;
memset(f,0,sizeof(f));
for(int i=1;i<=m;i++)
{
char s[100];
scanf("%s",s);
int a=0,b=0;
for(int j=0;j<n;j++)
{
if(s[j]=='*')
{
a=a*2+1;
b=b*2;
}
else
{
a=a*2+(s[j]-'0');
b=b*2+(s[j]-'0');
}
}
if(f[a]==0) h[gx++]=a,f[a]=1;
if(f[b]==0) h[gx++]=b,f[b]=1;
}
gy=gx;
memset(mat,false,sizeof(mat));
int i=0,j=0;
for(i=0;i<gx;i++)
for(j=0;j<gy;j++)
{
int c=h[i]^h[j];
if(c&&((c&(c-1))==0)) mat[i][j]=1;
}
printf("%d/n",gy-MaxMatch()/2);
}
return 0;
}