poj2724 Purifying Machine

来源:互联网 发布:高淇java 编辑:程序博客网 时间:2024/05/17 23:26
#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<bitset>using namespace std;const int MAX=2050;int n,m,match[MAX],v;bool used[MAX];vector<int> g[MAX],a;char ch[MAX][15];void add_edge(int u,int v){    g[u].push_back(v);    g[v].push_back(u);}bool dfs(int v){    used[v]=true;    for(int i=0;i<g[v].size();i++)    {        int &u=g[v][i],w=match[u];        if(w<0||!used[w]&&dfs(w))        {            match[u]=v;            match[v]=u;            return true;        }    }    return false;}int matching(){    int ans=0;    memset(match,-1,sizeof(match));    for(int i=0;i<v;i++)    {        if(match[i]<0)        {          memset(used,0,sizeof(used));          if(dfs(i))           ans++;        }    }    return ans;}int main(){    while(scanf("%d%d",&n,&m),n||m)    {        for(int i=0;i<m;i++)        {            int num=0;            scanf("%s",ch[i]);            for(int j=0;j<n;j++)            {                if(ch[i][j]=='1')                    num+=(1<<(n-j-1));            }            a.push_back(num);             for(int j=0;j<n;j++)            {                if(ch[i][j]=='*')                    num+=(1<<(n-j-1));            }            a.push_back(num);        }        sort(a.begin(),a.end());        a.erase(unique(a.begin(),a.end()),a.end());       v=a.size();       for(int i=0;i<=MAX;i++)            g[i].clear();        for(int i=0;i<v;i++)        {            for(int j=i+1;j<v;j++)            {                bitset<32> differ=a[i]^a[j];                if(differ.count()==1)                    add_edge(i,j);            }        }        printf("%d\n",v-matching());    }    return 0;}
此题的关键在于把相差一位的cheese连接起来,再通过求最大独立集得出答案
0 0