高斯消元
用O(\(n^3\))时间复杂度, 求解含有n个方程的n元线性方程组
\[\begin{cases} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n = b_1\\[1ex] a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n = b_2\\[1ex] \quad\quad\quad\quad\quad\quad\quad \vdots \\[1ex] a_{n1}x_1 + a_{n2}x_2 + \cdots + a_{nn}x_n = b_n\\[1ex] \end{cases} \]枚举每一列 c
① 找到绝对值最大的一行
② 将该行换到最上面
③ 将该行第1个数变成1
④ 将下面所有行的第c列消成0
//高斯消元解线性方程组模板
//a[N][N]是增广矩阵
int gauss()
{
int c,r;
for(c=0,r=0,c<n;c++)
{
int t=r;
for(int i=r;i<n;i++) //找到绝对值最大的行
if(fabs(a[i][c])>fabs(a[t][c]))
t=i;
if(fabs(a[t][c])<eps)continue;
for(int i=c;i<=n;i++)swap(a[t][i],a[r][i]);
//将绝对值最大的行换到最顶端
for(int i=n;i>=c;i--)a[r][i]/=a[r][c];
//将当前行的首位变成1
for(int i=r+1;i<=n;i++) //用当前行将下面所有的列消成0
if(fabs(a[i][c])>eps)
for(int j=n;j>=c;j--)
a[i][j]-=a[r][j]*a[i][c];
r++;
}
if(r<n)
{
for(int i=r;i<n;i++)
if(fabs(a[i][n])>eps)
return 2; //无解
return 1; //有无穷多解
}
for(int i=n-1;i>=0;i--)
for(int j=i+1;j<n;j++)
a[i][n]-=a[i][j]*a[j][n];
return 0; //唯一解
}