poj 1830 高斯消元
2015-11-07 01:28
239 查看
终于会一点高斯消元了,认真学还是学的进去啊。。。。。。
搞明白解异或方程的原理,然后构造出矩阵就好做了。模板题
View Code
搞明白解异或方程的原理,然后构造出矩阵就好做了。模板题
#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
相关文章推荐
- PageAdapter不能刷新问题
- 【恒生电子16年校招编程题】求两有序数组的交集并返回交集个数
- 关于C#类中重写ToString方法和PHP类中__tostring()方法的比较
- 在Android studio中建立Java工程
- TSP问题
- 自动布局
- 将VS2012的项目转化为VS2010
- c++重载运算符注意
- Y400中通过easybcd在win7下面的安装Ubuntu14
- *LeetCode-Permutation
- 计算几何 uva11117 Morley's Theorem
- 【JavaScript知识点二】JavaScript 变量
- BZOJ3012 : [Usaco2012 Dec]First!
- ActiveMQ LevelDB持久化机制
- HDU5526/BestCoder Round #61 (div.1)1004 Lie 背包DP
- uva10635 Prince and Princess(LCS转LIS)
- Linux 编译报错 undefined reference to `pthread_create'
- 菜鸟日记之JSP1
- Java之随机数
- 1106 1014 C语言文法定义与C程序的推导过程 冒泡程序语法树