博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

洛谷.3389.[模板]高斯消元法

题目链接

#include <cmath>
#include <cstdio>
#include <algorithm>
const int N=105;
const double eps=1e-10;

int n;
inline bool bigger(double a,double b) {return std::fabs(a)>std::fabs(b);}
inline bool cmp(double a) {return std::fabs(a)>eps;}
struct Gauss
{
	double f[N][N],ans[N];
	void Init()
	{
		for(int i=1; i<=n; ++i)
			for(int j=1; j<=n+1; ++j)
				scanf("%lf",&f[i][j]);
	}
	bool Solve()
	{
		for(int j=1; j<=n; ++j)
		{
			int mxrow=j;
			for(int i=j+1; i<=n; ++i)
				if(bigger(f[i][j],f[mxrow][j])) mxrow=i;
			if(mxrow!=j) std::swap(f[j],f[mxrow]);
//				for(int i=1; i<=n+1; ++i)
//					std::swap(f[j][i],f[mxrow][i]);
			for (int i=j+1; i<=n; ++i)
				if(cmp(f[i][j]))
				{
					double t=f[i][j]/f[j][j];
					for(int k=1; k<=n+1; ++k)
						f[i][k]-=f[j][k]*t;
				}
		}
		for(int i=n; i; --i)
		{
			if(!cmp(f[i][i])) return 0;
			for(int j=i+1; j<=n; ++j)
				f[i][n+1]-=f[i][j]*ans[j];
			ans[i]=f[i][n+1]/f[i][i];
		}
		return 1;
	}
	void Print()
	{
		for(int i=1; i<=n; ++i) printf("%.2lf\n",ans[i]);
	}
}g;

int main()
{
	scanf("%d",&n);
	g.Init();
	if(g.Solve()) g.Print();
	else printf("No Solution");
	return 0;
}
posted @ 2018-02-12 21:09  SovietPower  阅读(188)  评论(0编辑  收藏  举报