#C241017A. 高斯消元法


#C241017A. 高斯消元法

标签(Label)

  • 高斯消元

  • 数学

  • 模板

网址(Website)

P3389 【模板】高斯消元法 - 洛谷

高斯消元法 - Super

题解(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;
}

文章作者: WolfDeer
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 WolfDeer !
  目录