poj 2724 二分图匹配

来源:互联网 发布:影视鉴赏网络课答案16 编辑:程序博客网 时间:2024/06/03 17:25
#include<stdio.h>#include<string.h>#define N 1025int 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);}}

0 0
原创粉丝点击