高斯消元

在$O(n^3)$的复杂度下求解形如:
$$
\left{\begin{matrix}
a_{1,1}x_1+a_{1,2}x_2+\cdots+a_{1,n}x_n=b_1\
a_{2,1}x_1+a_{2,2}x_2+\cdots+a_{2,n}x_n=b_2\
\cdots\
a_{n,1}x_1+a_{n,2}x_2+\cdots+a_{n,n}x_n=b_n\
\end{matrix}\right.
$$
的线性方程组的解。

步骤:

枚举每一列c

  1. 找到绝对值最大的一行
  2. 将改行换到最上面
  3. 将该行的第一个数变成1
  4. 将下面所有行的第c列消成0

模板题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include<bits/stdc++.h>
using namespace std;

const int N=105;
const double eps=1e-6;

int n;
double 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];
}
for(int i=r+1;i<n;i++){
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;
}

int main(){
cin >> n;
for(int i=0;i<n;i++){
for(int j=0;j<n+1;j++){
cin >> a[i][j];
}
}
int t=gauss();

if(t==0){
for(int i=0;i<n;i++){
cout << fixed << setprecision(2) << a[i][n] << endl;
}
}
else{
cout << "No Solution\n";
}
return 0;
}