luogu P3389 【模板】高斯消元法

高斯消元法(这里的好像叫约旦消元?)可以用来求线性方程组的唯一解(如果无解或有多解输出“No Solution”)。

具体方法就是一个一个变量的扫,每次处理一个变量的时候找出一个系数不为\(0\)的方程,用这个方程把其他方程的、这个变量的系数给消掉(具体看代码吧感觉不太能解释清楚)。然后每个变量处理完以后最后就剩那个一开始钦定的系数了,最后除一下就行了。

代码:

#include<bits/stdc++.h>

using namespace std;

const int N = 109;
const double eps = 1e-10;
int n;
double a[N][N];

void init()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n + 1; j++)
			scanf("%lf", &a[i][j]);
}

void work()
{
	for (int i = 1; i <= n; i++)
	{
		int pos = i;
		for (int j = i + 1; j <= n; j++)
			if (a[j][i] - a[pos][i] > eps)
				pos = j;
		if (fabs(a[pos][i]) < eps)
		{
			puts("No Solution");
			return;
		}
		if (i != pos)
			swap(a[i], a[pos]);
		for (int j = 1; j <= n; j++)
		{
			if (j == i) continue;
			double tmp = a[j][i] / a[i][i];
			for (int k = 1; k <= n + 1; k++)
				a[j][k] -= a[i][k] * tmp;
		}
	}
	for (int i = 1; i <= n; i++)
		printf("%.2lf\n", a[i][n + 1] / a[i][i]);
}

int main()
{
	init();
	work();
	return 0;
}
posted @ 2020-05-02 15:53  With_penguin  阅读(129)  评论(0编辑  收藏  举报