您的位置:首页 > 其它

poj 1830 高斯消元

2015-11-07 01:28 239 查看
终于会一点高斯消元了,认真学还是学的进去啊。。。。。。

搞明白解异或方程的原理,然后构造出矩阵就好做了。模板题

#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <vector>
#include <cstdlib>

using namespace std;

const int maxn = 1000005;

typedef long long LL;

int A[35][35];

int gauss(int m,int n) //m个方程,n个变量
{
int i=0,j=0,k,r,u;
while(i < m && j <n ){ //当前处理i个方程j个变量
r = i;
for(k = i;k < m;k++){
if(A[k][j]){
r = k;
break;
}
}
if(A[r][j]){
if(r != i){
for(k = 0;k <= n;k++) swap(A[r][k],A[i][k]);
}
for(u = i+1;u < m;u++){
if(A[u][j]) for(k = i;k <= n;k++) A[u][k] ^= A[i][k];
}
i++;
}
j++;

}
for(j = i;j<n;j++){
if(A[j]
) return -1;
}
return n-i;
}

int main()
{
int t;
scanf("%d",&t);
int s[35],e[35];
while(t--){
memset(A,0,sizeof(A));
memset(s,0,sizeof(s));
memset(e,0,sizeof(e));
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&s[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&e[i]);
}
for(int i=0;i<n;i++){
if(s[i] != e[i])
A[i]
=1;
A[i][i] = 1;
}
int a,b;
while(scanf("%d%d",&a,&b)&&a+b){
a--;
b--;
A[b][a] = 1;
}
int ans = gauss(n,n);
if(ans == -1) puts("Oh,it's impossible~!!");
else printf("%d\n",1<<ans);

}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: