高斯消元模板
标签(空格分隔): 模板大作战
整数类型高斯消元
返回值的情况
- -2表示有浮点数解,但无整数解
- -1表示无解
- 0表示唯一解
- 大于0表示无穷解,并返回自由变元的个数
其他说明
有equ个方程,var个变元。
增广矩阵行数为equ,分别为0到equ-1,列数为var+1,分别为0到var.
#include <algorithm>
#include <cstring>
#include <cmath>
#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;i<equ;i++){
if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;
}
if(max_r!=k){
// 与第k行交换.
for(int j=k;j<var+1;j++) swap(a[k][j],a[max_r][j]);
}
if(a[k][col]==0){
// 说明该col列第k行以下全是0了,则处理当前行的下一列.
free_x[num++] = col;
k--;
continue