| 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;
}
本文介绍了一个净化机器模型的问题,该机器用于清理受病毒感染的奶酪。通过特定的操作状态,机器可以清洁一组特定编号的奶酪。文章探讨了如何在已知部分奶酪被感染的情况下,找到最少的操作次数来清理所有被感染的奶酪,并确保未被感染的奶酪不受影响。
887

被折叠的 条评论
为什么被折叠?



