高斯消元学习总结+例题

有具体的类型代码,先整理下来以后有空仔细分析

转大佬博客

整数类型高斯消元

返回值的情况

  1. -2表示有浮点数解,但无整数解
  2. -1表示无解
  3. 0表示唯一解
  4. 大于0表示无穷解,并返回自由变元的个数

其他说明

有equ个方程,var个变元。
增广矩阵行数为equ,分别为0到equ-1,列数为var+1,分别为0到var.

#include 
#include 
#include 
#define nmax 100
using namespace std;
int a[nmax][nmax];
int x[nmax];
int free_x[nmax];
int gcd(int a,int b){
    if(!b) return a; else return gcd(b,a%b);
}
int lcm(int a,int b){
    return a/gcd(a,b)*b;
}
int Gauss(int equ,int var){
    int k,max_r,col = 0,ta,tb;
    int LCM,temp,num = 0,free_index;
    for(int i=0;i<=var;i++){
        x[i]=0;
        free_x[i]=true;
    }
    for(k = 0;k < equ && col < var;k++,col++){
        max_r=k;
        for(int i=k+1;iabs(a[max_r][col])) max_r=i;
        }
        if(max_r!=k){// 与第k行交换.
            for(int j=k;j= 0; i--){
        temp = a[i][var];
        for (int j = i + 1; j < var; j++){
            if (a[i][j] != 0) temp -= a[i][j] * x[j];
        }
        if (temp % a[i][i] != 0) return -2; // 说明有浮点数解,但无整数解.
        x[i] = temp / a[i][i];
    }
    return 0;
}
1

浮点类型

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 1010;
const double EPS=1e-7;
int m,n;
double a[N][N],x[N];
int Gauss(int m,int n){
    int col=0, k=0;//col为列号,k为行号
    for (;kfabs(a[r][col]))r=i;
        if (fabs(a[r][col])EPS){
            double t = a[i][col]/a[k][col];
            for (int j=col;j<=n;j++)a[i][j]-=a[k][j]*t;
            a[i][col] = 0;
        }
    }
    for(int i=k ;iEPS) return -1;
    if (k < n) return n - k;  //自由元个数
    for (int i =n-1; i>=0; i--){//回带求解
        double temp = a[i][n];
        for (int j=i+1; j

求解异或方程组

经常需要枚举自由元

#include 
#include 
#include 
#include 
#define nmax 35
using namespace std;
int a[nmax][nmax];
int x[nmax];
int hashback[nmax][nmax];
int free_x[nmax];
char mp[nmax][nmax];
int ans1,ans2;
int equ,var;
int Gauss(){
    int max_r;
    int col=0,num = 0;
    int k;
    for(int i = 0;i<=var;++i) x[i] = free_x[i] = 0;
    for(k = 0;k < equ && col < var;k++,col++){
        max_r=k;
        for(int i=k+1;iabs(a[max_r][col])) max_r=i;
        }
        if(max_r!=k){
            for(int j=k ;j= 0; i--){
        x[i]=a[i][var];
        for(int j = i + 1; j < var; j++){
            x[i] ^= ( a[i][j] && x[j]);
        }
    }
    return 0;
}
void enum_freex(int n,int & ans){
    int num = (1<<(n));
    ans = 1e9+7;
    for(int i = 0;i=0;--k){// 没有自由元的最下面一行
            int index = 0;
            for(index = k;k

2、求解的问题

1、直接找出关系列方程组求解

POJ 2065 SETI

2、开关问题
主要是转化为求解异或方程组
POJ 1222 EXTENDED LIGHTS OUT
POJ 1681 Painter's Problem
POJ 1830 开关问题

3、解模线性方程组
根据题意需要,在消元运算的过程中需要对一个数p进行取模
POJ 2947 Widget Factory

4、在求期望概率时,可以转化为线性方程组求解
山东省第五届ACM省赛 Circle

 

你可能感兴趣的:(ACM,----,数据结构,ACM,----,知识点)