</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;
}
ACM 高斯消元(模板)
最新推荐文章于 2022-09-08 14:35:08 发布