ACM数学模板1 高斯消元 Gaussian Elimination

本文介绍了ACM竞赛中线性代数的高斯消元法,包括一般情况下的消元过程,如何处理不满秩矩阵,以及在bool矩阵方程求解中的应用。通过实例解析了高斯消元在解线性方程组和矩阵秩求解中的作用,并提供了代码示例。同时,讨论了在特定情况下如何处理全0行以及交换行列的操作,以及利用bitset进行优化的方法。
摘要由CSDN通过智能技术生成

声明:

题目来源:
https://www.luogu.com.cn/problem/P3389
https://www.luogu.com.cn/problem/P2447
https://ac.nowcoder.com/acm/problem/216159

首先介绍线性代数中一般情况下的高斯消元法:

对于一般的矩阵,通过第一行消去除第一行外所有的第一列元素,然后通过第二行消去除第一,二行外所有的第二列元素,以此类推。

重复上述步骤,可以得到一个上三角矩阵,做上述操作的逆操作,通过最后一列向上消元,重复向上消除,最终得到一个对角阵,单位化之后即可得到方程组的解。

这就是通常意义下高斯消元的模板题。
例1:https://www.luogu.com.cn/problem/P3389

代码如下:

#include<iostream>
#include<iomanip>

#define maxn 107

using namespace std;

int n; 
double p[maxn][maxn+1];

signed main(){
   
	cin>>n;
	for(int i=0;i<n;i++){
   
		for(int j=0;j<=n;j++){
   
			cin>>p[i][j];
		}
	}
	double div;
	
	for(int k=0;k<n;k++){
   
		div=p[k][k];
		if(div==0){
   
			cout<<"No Solution\n";
			return EOF+1;
		}
		for(int i=0;i<=n;i++){
   
			p[k][i]/=div;
		}
		for(int i=k+1;i<n;i++){
   
			div=p[i][k];
			for(int j=0;j<=n;j++){
   
				p[i][j]-=div*p[k][j];
			}
		}
	}
	
	for(int k=n-1;k>=0;k--){
   
		for(int i=k-1;i>=0;i--){
   
			div=p[i][k];
			for(int j=0;j<=n;j++){
   
				p[i][j]-=div*p[k][j];
			}
		}
	}
	
	for(int i=0;i<n;i++){
   
		cout<<fixed<<setprecision(2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值