高斯消元入门

luogu3389

https://www.luogu.org/problemnew/show/3389

板子题

#include<cstdio>
#include<cstdlib>
#define ROF(i,s,t) for(register int i=s;i>=t;--i)
#define FOR(i,s,t) for(register int i=s;i<=t;++i)
typedef double db;
int n;
db a[233][233];
db ans[233];
inline void gauss(){
	db mult;
	FOR(i,1,n){
		FOR(j,i+1,n){
			mult=-a[j][i]/a[i][i];
			FOR(k,i,n+1)
				a[i][k]*=mult,a[j][k]+=a[i][k];
			if(!a[j][j]){
				puts("No Solution");
				exit(0);
			}
		}
	}
}
inline void back(){
	db b;
	ROF(i,n,1){
		b=0;
		FOR(j,i+1,n)
			b+=a[i][j]*ans[j];
		ans[i]=(a[i][n+1]-b)/a[i][i];
	}
}
int main(){
	scanf("%d",&n);
	FOR(i,1,n)
		FOR(j,1,n+1)
			scanf("%lf",&a[i][j]);
	gauss();
	back();
	FOR(i,1,n)
		printf("%.2lf
",ans[i]);
	return 0;
}

  

BZOJ1013

http://www.lydsy.com/JudgeOnline/problem.php?id=1013

然后用1~n式减去(n+1)式,得到n个式子,x2和r2均被消去

得到n元线性方程组

然后高斯消元搞搞出解

#include<cstdio>
#include<cstdlib>
#define ROF(i,s,t) for(register int i=s;i>=t;--i)
#define FOR(i,s,t) for(register int i=s;i<=t;++i)
typedef double db;
int n;
db a[66][66],b[66][66],ans[66];
inline void gauss(){
	db mult;
	FOR(i,1,n){
		FOR(j,i+1,n){
			mult=-b[j][i]/b[i][i];
			FOR(k,i,n+1)
				b[i][k]*=mult,b[j][k]+=b[i][k];
		}
	}
}
inline void back(){
	db c;
	ROF(i,n,1){
		c=0;
		FOR(j,i+1,n)
			c+=b[i][j]*ans[j];
		ans[i]=(b[i][n+1]-c)/b[i][i];
	}
}
int main(){
	scanf("%d",&n);
	FOR(i,1,n+1){
		FOR(j,1,n){
			scanf("%lf",&a[i][j]);
			a[i][n+1]-=a[i][j]*a[i][j];
			a[i][j]=-2.00*a[i][j];
		}
	}
	FOR(i,1,n)
		FOR(j,1,n+1)
			b[i][j]=a[i][j]-a[n+1][j];
	gauss();
	back();
	printf("%.3lf",ans[1]);
	FOR(i,2,n)
		printf(" %.3lf",ans[i]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/Stump/p/8111248.html