声明:
题目来源:
https://www.luogu.com.cn/problem/P3389
https://www.luogu.com.cn/problem/P2447
https://ac.nowcoder.com/acm/problem/216159
首先介绍线性代数中一般情况下的高斯消元法:
对于一般的矩阵,通过第一行消去除第一行外所有的第一列元素,然后通过第二行消去除第一,二行外所有的第二列元素,以此类推。
重复上述步骤,可以得到一个上三角矩阵,做上述操作的逆操作,通过最后一列向上消元,重复向上消除,最终得到一个对角阵,单位化之后即可得到方程组的解。
这就是通常意义下高斯消元的模板题。
例1:https://www.luogu.com.cn/problem/P3389
代码如下:
#include<iostream>
#include<iomanip>
#define maxn 107
using namespace std;
int n;
double p[maxn][maxn+1];
signed main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<=n;j++){
cin>>p[i][j];
}
}
double div;
for(int k=0;k<n;k++){
div=p[k][k];
if(div==0){
cout<<"No Solution\n";
return EOF+1;
}
for(int i=0;i<=n;i++){
p[k][i]/=div;
}
for(int i=k+1;i<n;i++){
div=p[i][k];
for(int j=0;j<=n;j++){
p[i][j]-=div*p[k][j];
}
}
}
for(int k=n-1;k>=0;k--){
for(int i=k-1;i>=0;i--){
div=p[i][k];
for(int j=0;j<=n;j++){
p[i][j]-=div*p[k][j];
}
}
}
for(int i=0;i<n;i++){
cout<<fixed<<setprecision(2