高斯消元(xor方程组)模板

来源:互联网 发布:淘宝用绒里图片 编辑:程序博客网 时间:2024/05/01 12:21
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cstdlib>using namespace std;const int inf=0x3f3f3f3f;template <typename T>inline void _read(T& x){    char ch=getchar();bool sign=true;    while(!isdigit(ch)){if(ch=='-')sign=false;ch=getchar();}    for(x=0;isdigit(ch);ch=getchar())x=x*10+ch-'0';    if(!sign)x=-x;}int n,m;int N;int cnt=0;int sum=0;int minn;int map[55][55];int id[55][55];int num[2005];int ans[2005];int dx[5]={0,1,0,-1,0};int dy[5]={1,0,-1,0,0};int a[2005][2005];void dfs(int x,int var){int i,j,k;if(x==0&&var==0){cnt=0;for(i=1;i<=N;i++)cnt+=ans[i];minn=min(minn,cnt);return;}if(num[x]==var){ans[var]=a[x][N+1];for(i=var+1;i<=N;i++)ans[var]^=(a[x][i]&ans[i]);dfs(x-1,var-1);}else{ans[var]=1;dfs(x,var-1);ans[var]=0;dfs(x,var-1);}}void gauss(int equ,int var){int i,j,k,h,maxn;for(i=1,j=1;i<=equ&&j<=var;i++,j++){maxn=i;for(k=i+1;k<=equ;k++){if(a[maxn][j]<a[k][j])maxn=k;if(a[maxn][j]==1)break;}if(maxn!=i){for(k=j;k<=var+1;k++)swap(a[i][k],a[maxn][k]);}num[i]=j;if(a[i][j]==0){i--;continue;}for(k=i+1;k<=equ;k++){if(a[k][j]!=0){for(h=j;h<=var+1;h++){a[k][h]^=a[i][h];}}}}for(k=i;k<=equ;k++){if(a[k][var+1]!=0){puts("inf");return;}}if(i==var+1){for(i=var;i;i--){ans[i]=a[i][var+1];for(j=i+1;j<=var;j++){ans[i]^=(a[i][j]&ans[j]);}sum+=ans[i];}cout<<sum;return;}minn=inf;dfs(i-1,var);cout<<minn;return;}int main(){int i,j,k;cin>>n;N=n*n;for(i=1;i<=n;i++){for(j=1;j<=n;j++){id[i][j]=++cnt;}}for(i=1;i<=n;i++){for(j=1;j<=n;j++){char ch=getchar();while(!isalpha(ch))ch=getchar();if(ch=='w'){map[i][j]=1;a[id[i][j]][N+1]=1;}}}for(i=1;i<=n;i++){for(j=1;j<=n;j++){for(k=0;k<5;k++){int tx=i+dx[k];int ty=j+dy[k];if(tx<1||tx>n||ty<1||ty>n)continue;a[id[i][j]][id[tx][ty]]=1;}}}gauss(N,N);}

0 0
原创粉丝点击