高斯消元
在$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
- 将下面所有行的第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; }
|