题解 P3389 【【模板】高斯消元法】

· · 题解

高斯消元理解版

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