知识:高斯消元
背景
在图上求期望的时候
常常会遇到有环的情况
这个时候就必须解一个多元一次的方程组
主要思路
首先选择一个没有被消除的未知数
将包含这个未知数的方程的想要消除的这一项的系数变为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;
}