Painter's Problem POJ - 1681 高斯消元+枚举自由元
2017-11-03 20:35
495 查看
题意:和开关问题一模一样,就是多了一个求最少操作数的。当解唯一的时候,操作数是一定的。只有有自由元的时候,存在最小解,这个时候枚举自由元就行了。然后因为要枚举自由元,这里freex中放的是自由元
#include <iostream> #include <cmath> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> using namespace std; #define LL long long #define mem(a,b) memset(a,b,sizeof(a)) const int maxn = 250; int a[maxn][maxn]; int x[maxn],ans; bool freex[maxn]; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int lcm(int a,int b) { return a/gcd(a,b)*b; } //高斯消元,返回-1代表无解,-2表示有浮点数解,0表示唯一解,大于0表示有自由解 int gauss(int row,int col) { for(int i=0;i<=col;i++){ x[i]=0; freex[i]=0; } int c = 0; int r = 0,num=0; int maxr; for(;r<row&&c<col;r++,c++) { maxr = r; for(int i = r+1;i<row;i++) { if(abs(a[i][c])>abs(a[maxr][c])) maxr=i; } if(maxr!=r) { for(int j=c;j<=col;j++) swap(a[r][j],a[maxr][j]); } if(a[r][c]==0) { r--;freex[num++]=c; continue; } for(int i=r+1;i<row;i++) { if(a[i][c]!=0) { for(int j=c;j<=col;j++) { a[i][j]=a[i][j]^a[r][j]; } } } } //无解的情况 for(int i=r;i<row;i++) { if(a[i][col]!=0) return -1; } int tt=(1<<(col-r)); ans=100000; for(int k=0;k<tt;k++) { int temp=k; for(int j=0;j<col-r;j++) { x[freex[j]]=temp&1; temp=temp/2; } for(int i=r-1;i>=0;i--) { x[i]=a[i][col]; for(int j=i+1;j<col;j++) { if(a[i][j]!=0) x[i]^=(a[i][j]&&x[j]); } } int tmp=0; for(int i=0;i<col;i++) tmp+=x[i]; ans=min(tmp,ans); } return 0; } char s1[20]; int main() { int T; scanf("%d",&T); while(T--) { mem(a,0); int n; scanf("%d",&n); int t=-1; for(int i=0;i<n;i++) { scanf("%s",&s1); for(int j=0;j<n;j++) { ++t; if(s1[j]=='y') a[t][n*n]=0; else a[t][n*n]=1; } } for(int i=0;i<n*n;i++) { a[i][i]=1; if(i%n!=0) a[i][i-1]=1; if(i/n) a[i][i-n]=1; if(i%n!=(n-1)) a[i][i+1]=1; if(i/n<(n-1)) a[i][i+n]=1; } int k=gauss(n*n,n*n); if(k<0) printf("inf\n"); else printf("%d\n",ans); } return 0; }
相关文章推荐
- Painter's Problem POJ - 1681 高斯消元+枚举自由元
- Painter's Problem POJ - 1681 高斯消元+枚举自由元
- Painter's Problem POJ - 1681 高斯消元+枚举自由元
- Painter's Problem POJ - 1681 高斯消元+枚举自由元
- Painter's Problem POJ - 1681 高斯消元+枚举自由元
- Painter's Problem POJ - 1681 高斯消元+枚举自由元
- Painter's Problem POJ - 1681 高斯消元+枚举自由元
- Painter's Problem POJ - 1681 高斯消元+枚举自由元
- POJ 1681 Painter's Problem 高斯消元 枚举自由变量
- poj 1681 高斯消元 枚举自由元求翻转最小次
- poj 1681 Painter's Problem 【高斯消元 + 状压枚举自由变元】
- poj 1681 Painter's Problem 高斯消元 枚举自由变元
- POJ 1681 Painter's Problem 高斯消元+DFS枚举
- poj 1681 Painter's Problem 【高斯消元 枚举自由变元】
- poj 1681 Painter's Problem(高斯消元)
- poj 1681 Painter's Problem (高斯消元)
- poj 1681 Painter's Problem 高斯消元
- POJ 1681 Painter's Problem(高斯消元)
- POJ 1681 Painter's Problem (高斯消元)
- POJ-1681 Painter's Problem 高斯消元