#C241017A. 高斯消元法
标签(Label)
高斯消元
数学
模板
网址(Website)
题解(Solution)
$\qquad$找到当前位的最大值,并交换到第一列,把系数变为 $1$ ,同时把其他式子里面的相同未知数的系数变为 $0$ ,即可。
$\qquad$注意,$\mathrm{eps}$ 不要用 $\verb!int!$ 存!!!
代码(Code)
#include<bits/stdc++.h>
#include<vector>
#define For(i,l,r) for(int i=l;i<=r;i++)
#define Rof(i,l,r) for(int i=l;i>=r;i--)
using namespace std;
#define P pair<int,int>
#define int long long
#define x first
#define y second
inline int rd(){
char c;bool f=false;while(!isdigit(c=getchar()))f=c=='-';int x=c^48;
while(isdigit(c=getchar())){x=(((x<<2)+x)<<1)+(c^48);}return f?-x:x;
}const int inf = 0x3f3f3f3f3f3f3f3f;
const int N = 5005;
const double eps = 1e-9;
bool ST;
double a[N][N];
int n;
void solve(){
n = rd();For(i,1,n) For(j,1,n+1) scanf("%lf",&a[i][j]);
For(i,1,n){
int mx = i;
For(j,i+1,n) mx = fabs(a[j][i])>fabs(a[mx][i]) ? j : mx;
For(j,1,n+1) swap(a[mx][j], a[i][j]);//把系数最大的放到第i行
if(fabs(a[i][i]) < eps){
printf("No Solution");
return;
}
Rof(j,n+1,1) a[i][j] /= a[i][i];
For(j,1,n) if(j!=i){
double beishu = a[j][i]/a[i][i];
For(k,1,n+1) a[j][k] -= beishu*a[i][k];
}
}
For(i,1,n) printf("%.2lf\n",a[i][n+1]);
}
bool ED;
signed main(){
cerr<<abs(&ST-&ED)/1024./1024.<<"MB\n";
int T = 1, Tim = clock();
while(T--) solve();
return cerr<<"TIME:"<<(clock()-Tim)/1000.,0;
}