ACM 高斯消元(模板)

来源:互联网 发布:淘宝网货架 编辑:程序博客网 时间:2024/06/07 19:12
</pre><pre name="code" class="cpp">#include <iostream>#include <algorithm>#include <vector>#include <iomanip>using namespace std;typedef vector<double> vec;typedef vector<vec> mat;vec Gauss(const mat &A,const vec &b){int n=A.size();mat B(n,vec(n+1));double maxk;for(int i=0;i<n;i++){for(int j=0;j<n;j++){B[i][j]=A[i][j];}B[i][n]=b[i];}cout<<"计算前:"<<endl;for(int i=0;i<n;i++){for(int j=0;j<n+1;j++){cout<<setw(8)<<B[i][j]<<" ";}cout<<endl;}for(int k=0;k<n;k++){int maxi=k;maxk=B[k][k];for(int i=k+1;i<n;i++){if(maxk<abs(B[i][k])){maxk=abs(B[i][k]);maxi=i;}}swap(B[maxi],B[k]);if(abs(B[k][k])<1e-9) return vec();for(int i=k+1;i<n+1;i++) B[k][i]/=B[k][k];B[k][k]=1.0;for(int i=0;i<n;i++){if(i!=k)for(int j=k+1;j<n+1;j++){B[i][j]=B[i][j]-B[i][k]*B[k][j];}B[i][k]=0;}B[k][k]=1;}cout<<"计算后:"<<endl;for(int i=0;i<n;i++){for(int j=0;j<n+1;j++){cout<<setw(8)<<B[i][j]<<" ";}cout<<endl;}vec x(n);for(int i=0;i<n;i++) x[i]=B[i][n];return x;}int main(){mat A(3,vec(3));vec b(3);A[0][0]=1;A[0][1]=-2;A[0][2]=3;A[1][0]=4;A[1][1]=-5;A[1][2]=6;A[2][0]=7;A[2][1]=-8;A[2][2]=10;b[0]=6;b[1]=12;b[2]=21;vec x=Gauss(A,b);return 0;}


0 0
原创粉丝点击