知识:高斯消元

背景

在图上求期望的时候

常常会遇到有环的情况

这个时候就必须解一个多元一次的方程组

主要思路

首先选择一个没有被消除的未知数

将包含这个未知数的方程的想要消除的这一项的系数变为1

再用这一个方程去消除其他方程中的这个未知数

也就是疯狂的主元法

代码

#include<iostream>
#include<cstdio>
using namespace std;
int n;
double a[105][105];
double f_abs(double x)
{
	if(x<0)
		return -x;
	return x;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n+1;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++)//枚举每一列
	{
		int maxx=i;
		for(int j=i+1;j<=n;j++)//选出最大的,尽可能避免精度问题
			if(f_abs(a[j][i])>f_abs(a[maxx][i]))
				maxx=j;
		swap(a[i],a[maxx]);//交换两行
		if(a[i][i]==0)//说明有重复的方程,也就是指不可能将所有元都消掉
		{
			cout<<"No Solution";
			return 0;
		}
		for(int j=1;j<=n;j++)//每一项都减去这个方程
		{
			if(j!=i)
			{
				double t=a[j][i]/a[i][i];
				for(int k=i+1;k<=n+1;k++)
				{
					a[j][k]-=t*a[i][k];
				}
			}
		}
	}
	for(int i=1;i<=n;i++)
		printf("%.2lf\n",a[i][n+1]/a[i][i]);
	return 0;
}
posted @ 2019-12-13 16:10  loney_s  阅读(162)  评论(0)    收藏  举报