poj 3185 The Water Bowls (高斯消元)

来源:互联网 发布:回家吃饭网络订餐 编辑:程序博客网 时间:2024/05/21 11:26

高斯消元水过

#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<queue>#include<map>#include<set>using namespace std;#define B(x) (1<<(x))void cmax(int& a,int b){ if(b>a)a=b; }void cmin(int& a,int b){ if(b<a)a=b; }typedef long long ll;const int oo=0x3f3f3f3f;const ll OO=1LL<<61;const int MOD=10007;const int maxn=444;int maze[maxn][maxn];int x[maxn],fx[maxn];int Gauss(int n,int m){    int r,c,num=0;    memset(x,0,sizeof x);    for(r=0,c=0;r<n&&c<m;r++,c++){        int id=r;        for(int i=r+1;i<n;i++){            if(maze[i][c]>maze[id][c]){                id=i;            }        }        if(id!=r){            for(int j=c;j<=m;j++){                swap(maze[id][j],maze[r][j]);            }        }        if(maze[r][c]==0){            r--;            fx[num++]=c;            continue;        }        for(int i=r+1;i<n;i++){            if(maze[i][c]!=0){                for(int j=c;j<=m;j++){                    maze[i][j]^=maze[r][j];                }            }        }    }    for(int i=r;i<n;i++){        if(maze[i][c]!=0)return -1;    }    int S=B(c-r),cnt,ans=oo;    for(int s=0;s<S;s++){        cnt=0;        int st=s;        for(int i=0;i<c-r;i++){            x[fx[i]]=st&1;            if(x[fx[i]])cnt++;            st>>=1;        }        for(int i=r-1;i>=0;i--){            x[i]=maze[i][m];            for(int j=i+1;j<m;j++){                x[i]^=(maze[i][j]&&x[j]);            }            if(x[i])cnt++;        }        cmin(ans,cnt);    }    return ans;}void Init(int n){    memset(maze,0,sizeof maze);    for(int i=0;i<n;i++){        maze[i][i]=1;        if(i>0)maze[i-1][i]=1;        if(i<n-1)maze[i+1][i]=1;    }}bool input(int n){    Init(n);    for(int i=0;i<n;i++){        if(scanf("%d",&maze[i][n])==EOF)            return false;    }    return true;}int main(){//#define ON 1#ifdef ON    freopen("G:\\read.txt","r",stdin);#endif // ON    while(input(20)){        int ans=Gauss(20,20);        printf("%d\n",ans);    }    return 0;}/***/




0 0
原创粉丝点击