首先...使用abs()等数学函数的时候,浮点数用#include<cmath>,其它用#include<cstdlib>。

概念:

【矩阵的秩】

线性代数中,一个矩阵A的列秩是A的线性无关的纵列的极大数目。类似地,行秩是A的线性无关的横行的极大数目。

此题如果有解,解的个数便是2^(自由变元个数),因为每个变元都有两种选择,既1 << n

对于r以下的行,必定全是0,那么如果a[i][n]!=0 必然出现矛盾,于是判定无解。

 #include <iostream>
#include <cstdlib>
#include <cstring>
#include <stdio.h>
using namespace std; const int MAXN = ; int a[MAXN][MAXN];//增广矩阵
int x[MAXN];//解集
bool free_x[MAXN];//标记是否是不确定的变元 void Debug(int equ, int var){
int i, j;
for (i = ; i < equ; i++){
for (j = ; j < var + ; j++){
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl;
} int gcd(int a, int b){
int t;
while (b != ){
t = b;
b = a%b;
a = t;
}
return a;
}
int lcm(int a, int b){
return a / gcd(a, b)*b;//先除后乘防溢出
} // 高斯消元法解方程组(Gauss-Jordan elimination).(-2表示有浮点数解,但无整数解,
//-1表示无解,0表示唯一解,大于0表示无穷解,并返回自由变元的个数)
//有equ个方程,var个变元。增广矩阵行数为equ,分别为0到equ-1,列数为var+1,分别为0到var.
int Gauss(int equ, int var){
int i, j, k;
int max_r;// 当前这列绝对值最大的行.
int col;//当前处理的列
int ta, tb;
int LCM;
int temp;
int free_x_num;
int free_index; for (int i = ; i <= var; i++){
x[i] = ;
free_x[i] = true;
} //转换为阶梯阵.
col = ; // 当前处理的列
for (k = ; k < equ && col < var; k++, col++){// 枚举当前处理的行.
// 找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差)
max_r = k;
for (i = k + ; i<equ; i++){
if (abs(a[i][col])>abs(a[max_r][col])) max_r = i;
}
if (max_r != k){// 与第k行交换.
for (j = k; j < var + ; j++) swap(a[k][j], a[max_r][j]);
}
if (a[k][col] == ){// 说明该col列第k行以下全是0了,则处理当前行的下一列.
k--;
continue;
}
for (i = k + ; i < equ; i++){// 枚举要删去的行.
if (a[i][col] != ){
LCM = lcm(abs(a[i][col]), abs(a[k][col]));
ta = LCM / abs(a[i][col]);
tb = LCM / abs(a[k][col]);
if (a[i][col] * a[k][col] < )tb = -tb;//异号的情况是相加
for (j = col; j < var + ; j++)
{
a[i][j] = a[i][j] * ta - a[k][j] * tb;
}
}
}
} // Debug(); // 1. 无解的情况: 化简的增广阵中存在(0, 0, ..., a)这样的行(a != 0).
for (i = k; i < equ; i++){ // 对于无穷解来说,如果要判断哪些是自由变元,那么初等行变换中的交换就会影响,则要记录交换.
if (a[i][col] != ) return -;
}
// 2. 无穷解的情况: 在var * (var + 1)的增广阵中出现(0, 0, ..., 0)这样的行,即说明没有形成严格的上三角阵.
// 且出现的行数即为自由变元的个数.
if (k < var){
// 首先,自由变元有var - k个,即不确定的变元至少有var - k个.
for (i = k - ; i >= ; i--){
// 第i行一定不会是(0, 0, ..., 0)的情况,因为这样的行是在第k行到第equ行.
// 同样,第i行一定不会是(0, 0, ..., a), a != 0的情况,这样的无解的.
free_x_num = ; // 用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元.
for (j = ; j < var; j++){
if (a[i][j] != && free_x[j]) free_x_num++, free_index = j;
}
if (free_x_num > ) continue; // 无法求解出确定的变元.
// 说明就只有一个不确定的变元free_index,那么可以求解出该变元,且该变元是确定的.
temp = a[i][var];
for (j = ; j < var; j++){
if (a[i][j] != && j != free_index) temp -= a[i][j] * x[j];
}
x[free_index] = temp / a[i][free_index]; // 求出该变元.
free_x[free_index] = ; // 该变元是确定的.
}
return var - k; // 自由变元有var - k个.
}
// 3. 唯一解的情况: 在var * (var + 1)的增广阵中形成严格的上三角阵.
// 计算出Xn-1, Xn-2 ... X0.
for (i = var - ; i >= ; i--){
temp = a[i][var];
for (j = i + ; j < var; j++){
if (a[i][j] != ) temp -= a[i][j] * x[j];
}
if (temp % a[i][i] != ) return -; // 说明有浮点数解,但无整数解.
x[i] = temp / a[i][i];
}
return ;
}
int start[MAXN];
int endd[MAXN]; int main(){
int t;
cin >> t;
while (t--){
int n;
cin >> n;
for (int i = ; i < n; i++) cin >> start[i];
for (int i = ; i < n; i++) cin >> endd[i];
memset(a, , sizeof(a));
int b, c;
while (cin >> b >> c && (b || c)){
a[c - ][b - ] = ;
}
for (int i = ; i < n; i++)a[i][i] = ;
for (int i = ; i < n; i++)a[i][n] = start[i] ^ endd[i];
//Debug(n, n);
int ans = Gauss(n, n);
if (ans == -) cout << "Oh,it's impossible~!!" << endl;
else cout << ( << ans) << endl;
}
}

From:http://blog.csdn.net/zhengnanlee/article/details/11602995

POJ 1830 【高斯消元第一题】的更多相关文章

  1. POJ 1830 高斯消元

    开关问题   Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为 ...

  2. POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题

    http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...

  3. POJ SETI 高斯消元 + 费马小定理

    http://poj.org/problem?id=2065 题目是要求 如果str[i] = '*'那就是等于0 求这n条方程在%p下的解. 我看了网上的题解说是高斯消元 + 扩展欧几里德. 然后我 ...

  4. HDU 3359 高斯消元模板题,

    http://acm.hdu.edu.cn/showproblem.php?pid=3359 题目的意思是,由矩阵A生成矩阵B的方法是: 以a[i][j]为中心的,哈曼顿距离不大于dis的数字的总和 ...

  5. *POJ 1222 高斯消元

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 62 ...

  6. 【BZOJ 1013】【JSOI2008】球形空间产生器sphere 高斯消元基础题

    最基础的高斯消元了,然而我把j打成i连WA连跪,考场上再犯这种错误就真的得滚粗了. #include<cmath> #include<cstdio> #include<c ...

  7. POJ 2065 高斯消元求解问题

    题目大意: f[k] = ∑a[i]*k^i % p 每一个f[k]的值就是字符串上第 k 个元素映射的值,*代表f[k] = 0 , 字母代表f[k] = str[i]-'a'+1 把每一个k^i求 ...

  8. poj 2065 高斯消元(取模的方程组)

    SETI Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1735   Accepted: 1085 Description ...

  9. POJ 1222 高斯消元更稳

    大致题意: 有5*6个灯,每个灯只有亮和灭两种状态,分别用1和0表示.按下一盏灯的按钮,这盏灯包括它周围的四盏灯都会改变状态,0变成1,1变成0.现在给出5*6的矩阵代表当前状态,求一个能全部使灯灭的 ...

随机推荐

  1. 常见排序算法C++总结

    看了总结图,我这里就总结一下 直接插入排序,冒泡排序,快速排序,堆排序和归并排序,使用C++实现 重新画了总结图 直接插入排序 整个序列分为有序区和无序区,取第一个元素作为初始有序区,然后第二个开始, ...

  2. contains 和 ele.compareDocumentPosition确定html节点间的关系

    ~~~ nodeA.contains(nodeB) //ie ,   nodeA.compareDocumentPosition(nodeB) //firefox opera 1.DOMElement ...

  3. perl5 第十二章 Perl5中的引用/指针

    第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用  子程序模板七.数组与子程序八.文件句 ...

  4. Github 初识(上传、下载)

    Git - 版本控制工具Github - 一个网站,提供给用户空间创建git仓储,保存用户的一些数据文档或者代码等GitLab - 基于Git的项目管理软件   上传 1 首先在Github 上注册一 ...

  5. 关于我们_ | 腕表时代watchtimes.com.cn

    关于我们_ | 腕表时代watchtimes.com.cn 关于我们         腕表时代是北京兰会时光科技有限公司旗下运营的手表网站.腕表时代于2013年5月17日正式上线.秉承专业.生动.实用 ...

  6. Ghost.py 0.1b3 : Python Package Index

    Ghost.py 0.1b3 : Python Package Index Ghost.py 0.1b3 Download Ghost.py-0.1b3.tar.gz Webkit based web ...

  7. iphone开发小记

    程序功能:点击Button实现按钮的文本变换 一,打开Xcode,新建single view based application,拖动一个Button控件到屏幕中间 项目目录树下包含AppDelega ...

  8. How to Programmatically Add/Delete Custom Options in Magento? - See more at: http://apptha.com/blog/

    In this tutorial, I would like to help out Magento developers and clients with how to programmatical ...

  9. The model used to open the store is incompatible with the one used to create the store

    说什么数据不兼容,,,,这时删除模拟器的应用,,,重新启动测试.

  10. Identity-修改Error错误提示为中文

    第一步:重写IdentityErrorDescriber public class CustomIdentityErrorDescriber : IdentityErrorDescriber     ...