[AcWing 883] 高斯消元解线性方程组

image
image

复杂度 O(n3)

总体复杂度 1003=1×106


点击查看代码
#include<iostream>
#include<cmath>

using namespace std;
const int N = 110;
const double eps = 1e-9;
int n;
double a[N][N];

int gauss()
{
    int c, r;
    for (c = 0, r = 0; c < n; c ++) {
        int t = r;
        // 找绝对值最大的行
        for (int i = r; i < n; i ++) {
            if (fabs(a[t][c]) < fabs(a[i][c]))
                t = i;
        }
        if (fabs(a[t][c]) < eps)    continue;
        // 将绝对值最大的行替换到最上面
        for (int i = c; i <= n; i ++)   swap(a[t][i], a[r][i]);
        // 将当前行的首位变成 1
        for (int i = n; i >= c; i --)   a[r][i] /= a[r][c];
        // 用当前行将下面所有的列消为 0
        for (int i = r + 1; i < n; i ++)
            if (fabs(a[i][c]) > eps)
                for (int j = n; j >= c; j --)
                    a[i][j] -= a[r][j] * a[i][c];
        r ++;
    }
    if (r < n)  {
        for (int i = r; i < n; i ++)
            if (fabs(a[i][n]) > eps)
                return 2;   // 无解
        return 1;    // 无穷多组解
    }
    // 从下往上倒推出解
    for (int i = n - 1; i >= 0; i --)
        for (int j = i + 1; j < n; j ++)
            a[i][n] -= a[i][j] * a[j][n];
    return 0;    // 唯一解
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++)
        for (int j = 0; j < n + 1; j ++)
            cin >> a[i][j];
    int t = gauss();
    if (t == 0) {
        for (int i = 0; i < n; i ++) {
            // 去掉 -0.00 的情况
            if (fabs(a[i][n]) < eps)    a[i][n] = 0;
            printf("%.2f\n", a[i][n]);
        }
    }
    else if (t == 1)    puts("Infinite group solutions");
    else    puts("No solution");
    return 0;
}

  1. 行列式的初等行列变换
    ① 把某一行乘以一个非零的常数;
    ② 交换某两行;
    ③ 把某一行的若干倍加到另一行;
  2. 判断解的个数
    ① 完美阶梯型:唯一解;
    ② 出现 0 = 非 0 :无解;
    ③ 出现 0 = 0:无穷多组解;
  3. 高斯消元
    枚举每一列 c (已经换过的行不动,只对未换过的行执行以下操作)
    ① 找到绝对值最大的一行;(c 列中绝对值最大的)
    ② 将该行换到最上面;(未换过的行中的最上面,换过的行的下面)
    ③ 将该行的第一个数变为 1;
    ④ 将下面所有行的第 c 列清成 0;
posted @   wKingYu  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
欢迎阅读『[AcWing 883] 高斯消元解线性方程组』
点击右上角即可分享
微信分享提示