码迷,mamicode.com
首页 > 其他好文 > 详细

luogu P3389 【模板】高斯消元法

时间:2020-05-02 17:23:37      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:模板   tmp   solution   方法   turn   stream   wap   处理   ++   

高斯消元法(这里的好像叫约旦消元?)可以用来求线性方程组的唯一解(如果无解或有多解输出“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\n",a[i][n+1]/a[i][i]);
}

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

luogu P3389 【模板】高斯消元法

标签:模板   tmp   solution   方法   turn   stream   wap   处理   ++   

原文地址:https://www.cnblogs.com/With-penguin/p/12818392.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!