P3389 【模板】高斯消元法

P3389 【模板】高斯消元法

题目背景

Gauss消元

题目描述

给定一个线性方程组,对其求解

输入输出格式

输入格式:

第一行,一个正整数 nn

第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 \cdots a_na1?,a2??an? 和 bb,代表一组方程。

输出格式:

共n行,每行一个数,第 ii行为 x_ixi? (保留2位小数)

如果不存在唯一解,在第一行输出"No Solution".

输入输出样例

输入样例#1: 复制

3
1 3 4 5
1 4 7 3
9 3 2 2

输出样例#1: 复制

-0.97
5.18
-2.39

说明

1 \leq n \leq 100, \left | a_i \right| \leq {10}^4 , \left |b \right| \leq {10}^41≤n≤100,∣ai?∣≤104,∣b∣≤104

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int n;
double f[101][101],ans[101];
const double eps=1e-12;

int dcmp(double x)
{
    if(x<=eps && x>=-eps) return 0;
    return (x>0)?1:-1;
}

bool gauss()
{
    for(int i=1;i<=n;i++)
    {
        int num=i;
        for(int j=i+1;j<=n;j++)
          if(dcmp(f[i][j]-f[num][i])>0)
            num=j;
        if(num!=i)
          for(int j=1;j<=n+1;j++)
            swap(f[i][j],f[num][j]);
        for(int j=i+1;j<=n;j++)
          if(dcmp(f[j][i]))
          {
                double t=f[j][i]/f[i][i];
                for(int k=1;k<=n+1;k++)
                  f[j][k]-=t*f[i][k];
          }
    }

    for(int i=n;i>=1;i--)
    {
        if(dcmp(f[i][i])==0) return 0;
        for(int j=i+1;j<=n;j++) f[i][n+1]-=f[i][j]*ans[j];
        ans[i]=f[i][n+1]/f[i][i];
    }return 1;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n+1;j++)
        scanf("%lf",&f[i][j]);

    if(gauss())
      for(int i=1;i<=n;i++)
        printf("%.2lf\n",ans[i]);
    else puts("No Solution\n");
    return 0;
}
时间: 2024-10-14 20:49:42

P3389 【模板】高斯消元法的相关文章

题解 P3389 【【模板】高斯消元法】

题解 P3389 [[模板]高斯消元法] 看到大家都没有重载运算符,那我就重载一下运算符给大家娱乐一下 我使用的是高斯-约旦消元法,这种方法是精度最高的(相对地) 一句话解释高斯约旦消元法: 通过加减消元法,依次制定x0,并通过加减消元法消去其他方程的x0的系数.对于这样的系数矩阵我们只进行初等变幻保证了其正确性 看代码吧,主要是希望帮助大家可以学到一些重载的方法 #include<iostream> #include<cstdio> #include<algorithm&g

高斯消元法(Gauss Elimination)【超详解&amp;模板】

高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. 所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解. 1.线性方程组 1)构造增广矩阵,即系数矩阵A增加上常数向量b(A|b) 2)通过以交换行.某行乘以非负常数和两行相加这三种初等变化将原系统转化为更简单的三角形式(triangular form) 注:这里的初等变化可以通过

【模板】高斯消元法

传送门 关于高斯消元的具体过程 详见百度经验 模板 #include <cmath> #include <cstdio> #include <iostream> #define N 201 using namespace std; int n; double a[N][N]; //消成上三角 inline void Guass() { int i, j, k; double div; //枚举列 for(j = 1; j <= n; j++) { //找出最大的主

【洛谷P3389】【模板】高斯消元

题目链接 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1, a2 .....an? 和 b,代表一组方程. 输出格式: 共n行,每行一个数,第 i行为 xi? (保留2位小数) 如果不存在唯一解,在第一行输出"No Solution". 输入输出样例 输入样例#1: 3 1 3 4 5 1 4 7 3 9 3 2 2 输出样例#1: -0.97 5.18 -2.39 说明 1≤n≤100,∣ai?

(模板)poj1681 高斯消元法求异或方程组(无解、唯一解、多解)

题目链接:https://vjudge.net/problem/POJ-1681 题意:类似于poj1222,有n×n的01矩阵,翻转一个点会翻转其上下左右包括自己的点,求最少翻转多少点能使得矩阵全0. 思路: 同样的可以枚举第一行的状态,这里不说了. 用高斯消元法来解这道题,每个点的状态表示一个变量,那么有n*n个方程,n*n个变量的方程组,用高斯消元法来解,可能存在无解,唯一解,多解的情况.多解的时候要枚举自由变元的状态. AC代码: /* poj1681 开关问题,高斯消元法解异或方程组

【Luogu】P3389高斯消元模板(矩阵高斯消元)

题目链接 高斯消元其实是个大模拟qwq 所以就着代码食用 首先我们读入 for(int i=1;i<=n;++i) for(int j=1;j<=n+1;++j) scanf("%lf",&s[i][j]); 读入肯定没什么问题(不过我在这卡了一分多钟) 然后我们要进行消元操作 所谓消元操作其实就是对于输入的矩阵 比如说 9 3 2 2 1 4 7 3 1 3 4 5 进行一番乱搞,使得第当前枚举的(比如说枚举第i行第i列)s[i][j]系数变成1. 实际上就是整行

LG3389 【模板】高斯消元法 高斯消元

问题描述 LG3389 题解 高斯消元,是用来解\(n\)元一次方程组的算法,时间复杂度\(O(n^3)\) 这样就构造出了这个方程组的矩阵 目标就是把这个矩阵左边\(n \times n\)消为单位矩阵 \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; void read(int &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch<'0'||ch&

Luogu3389 【模板】高斯消元法

题目传送门 算法分析 高斯消元,是求解\(n\)个\(n\)元\(1\)次方程组的算法,一般情况下时间复杂度为\(O(n^3)\). 我们把这\(n\)个方程组看成一个\(n\times (n+1)\)的矩阵.以样例为例: \[ \left( \begin{matrix} {{x}_{1}} & 3\times {{x}_{2}} & 4\times {{x}_{3}} \ {{x}_{1}} & 4\times {{x}_{2}} & 7\times {{x}_{3}}

luogu 3389 【模板】高斯消元法

#include <bits/stdc++.h> #define N 104 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n; double g[N][N]; void Gauss() { int i,j,k,now; for(i=1;i<=n;++i) { now=i; for(j=i+1;j<=n;++j) if(fabs(g[j][i])>