POJ 1830 开关问题 高斯消元求自由变元

来源:互联网 发布:孤岛惊魂4流畅优化 编辑:程序博客网 时间:2024/04/30 03:12

题目链接:http://poj.org/problem?id=1830

代码:

#include <algorithm>#include <cstdio>#include <cstring>#define sf scanf#define pf printfusing namespace std;const int maxn = 50;typedef int Matrix[maxn][maxn];Matrix A;int n;int Gauss(){    //i为行 j为列    int i,j,k,q;    for(i = 0,j = 0;i < n && j < n;++j){        k = i;        for(q = i + 1;q < n;++q)            if(A[q][j] > A[k][j]) k = q;        if(A[k][j]){            for(q = 0;q <= n;++q) swap(A[k][q],A[i][q]);            for(k = 0;k < n;++k){                if(k != i && A[k][j]){                    for(q = 0;q <= n;++q) A[k][q] = A[k][q] ^ A[i][q];                }            }            i++;        }    }    for(j = i;j < n;++j)        if(A[j][n]) return -1;    return n - i;}int main(){    int T;sf("%d",&T);    while(T--){        sf("%d",&n);        memset(A,0,sizeof A);        for(int i = 0;i < n;++i) sf("%d",&A[i][n]);        for(int i = 0;i < n;++i){            int tmp;sf("%d",&tmp);            A[i][n] = A[i][n] ^ tmp;            A[i][i] = 1;        }        int u,v;        while(sf("%d %d",&u,&v),(u || v)){            u--,v--;            A[v][u] = 1;        }        int cnt = Gauss();        if(cnt != -1) pf("%d\n",1 << cnt);        else pf("Oh,it's impossible~!!\n");    }}
0 0
原创粉丝点击