题解 P3389 【【模板】高斯消元法】
peterwuyihong
·
·
题解
高斯消元理解版
By Peter_Wu
先把式子变成矩阵\
$1,4,7|3$\
$9,3,2|2$\
先把他变成上三角矩阵:\
$a,b,c|d$\
$0,e,f|g$\
$0,0,h|i$\
这时只要每次消一个元\
再回代计算\
$1,0,0|ans1$\
$0,1,0|ans2$\
$0,0,1|ans3$\
这时只要还是每次消一个元
### 这就简单了
```cpp
#include<bits/stdc++.h>
using namespace std;
int n;
double s[101][101],ans[101];
bool ok(int x)//若一行都是0则无解
{
for(int i=1;i<=n;i++)
if(fabs(s[x][i])>1e-6)return 1;
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
scanf("%lf",&s[i][j]);
scanf("%lf",&ans[i]);
}
for(int i=1;i<n;i++)//变成上三角矩阵
for(int j=i+1;j<=n;j++)
{
double base=s[j][i]/s[i][i];
for(int k=i;k<=n;k++)
s[j][k]=s[i][k]*base-s[j][k];
ans[j]=ans[i]*base-ans[j];
}
for(int i=1;i<=n;i++)
if(!ok(i))return puts("No Solution"),0;
for(int i=n;i;i--)//变成一条斜线矩阵
{
for(int j=i+1;j<=n;j++)
ans[i]-=ans[j]*s[i][j],s[i][j]=0;
ans[i]/=s[i][i],s[i][i]=1;
}
for(int i=1;i<=n;i++)//输出答案
printf("%.2f\n",ans[i]);
}
```
# 建议这个模板天天打,因为实在太难调了Orz