luogu P3389 模板高斯消元法

Posted with-penguin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P3389 模板高斯消元法相关的知识,希望对你有一定的参考价值。

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

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

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;

const int N=109;
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 j=1;j<=n;j++)
	{
		int Max=j;
		for (int i=j+1;i<=n;i++)
			if(fabs(a[i][j])>fabs(a[Max][j]))
				Max=i;
		if(a[Max][j]==0)
		{
			puts("No Solution");
			return;
		}
		for (int k=1;k<=n+1;k++)
			swap(a[Max][k],a[j][k]);
		for (int i=1;i<=n;i++)
			if(i!=j)
			{
				double tmp=a[i][j]/a[j][j];
				for (int k=j+1;k<=n+1;k++)
					a[i][k]-=a[j][k]*tmp;
			}
	}
	for (int i=1;i<=n;i++)
		printf("%.2lf
",a[i][n+1]/a[i][i]);
}

int main()
{
	init();
	work();
	return 0;
}

以上是关于luogu P3389 模板高斯消元法的主要内容,如果未能解决你的问题,请参考以下文章

P3389 模板高斯消元法

P3389 模板高斯消元法

P3389 模板高斯消元法

P3389 模板高斯消元法

P3389 模板高斯消元法

Luogu3389 模板高斯消元法