zoukankan      html  css  js  c++  java
  • 高斯消元

    https://www.luogu.org/problemnew/show/P3389

    高斯消元用来解决n元一次方程组,复杂度为n ^ 3

    流程和初中学的那个加减消元法差不多

    首先我们存储方程的各项系数(就相当于把向量存下来)

    然后我们依次消去每项,具体的,把每次没有消掉的那一项(设为k)的系数最大值的那个方程的系数变为1,然后用这个方程的系数依次减去每个方程,让其他方程的k的系数为0

    做到最后,你就获得了一个右上角矩阵,解出最低下的一项,依次回代即可

    几个细节:

    1.取系数最大值是为了防止精度误差

    2.无解的情况就是一个方程的未知数系数为0但结果不为0;多解就是像00000这样的一列有多个

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<map>
    #include<cmath>
    using namespace std;
    inline int read()
    {
        int ans = 0,op = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9')
        {
            if(ch == '-') op = -1;
            ch = getchar();
        }
        while(ch >= '0' && ch <= '9')
        {
            (ans *= 10) += ch - '0';
            ch = getchar();
        }
        return ans * op;
    }
    #define db double
    const db eps = 1e-7;
    const int maxn = 101;
    db mp[maxn][maxn],ans[maxn];
    int n;
    void gauss(int i)
    {
        int t = i;
        for(int j = i + 1;j <= n;j++)
            if(fabs(mp[t][i]) < fabs(mp[j][i])) t = j;    
        if(fabs(mp[t][i]) < eps)
        {
            printf("No Solution");
            exit(0);
        }
        if(i != t) swap(mp[i],mp[t]);
        db div = mp[i][i];
        for(int j = i;j <= n + 1;j++)
            mp[i][j] /= div;
        for(int j = i + 1;j <= n;j++)
        {
            div = mp[j][i];
            for(int k = i;k <= n + 1;k++)
                mp[j][k] -= div * mp[i][k];
        }
    }
    int main()
    {
        n = read();
        for(int i = 1;i <= n;i++)
            for(int j = 1;j <= n + 1;j++)
                scanf("%lf",&mp[i][j]);
        for(int i = 1;i <= n;i++) gauss(i);
        ans[n] = mp[n][n + 1];
        for(int i = n - 1;i >= 1;i--)
        {
            ans[i] = mp[i][n + 1];
            for(int j = i + 1;j <= n;j++) ans[i] -= mp[i][j] * ans[j];
        }
        for(int i = 1;i <= n;i++) printf("%.2lf
    ",ans[i]);
    }
    View Code
  • 相关阅读:
    10.13_extjs,combox,效率为什么这么低
    10.12_win8风格,把专业书籍当小说看,SQLite
    10.11_魔兽世界
    10.10_魔兽账号,OSC代码托管演示,研究SQL别忘记了,git
    10.09_命名:包名、类名、方法名
    10.08_逛逛OSC
    国庆第七日(2014年10月7日17:55:56),随手记,一些关注的OSC软件,花生壳
    国庆第六日(2014年10月6日11:51:15),node-webkit,理财产品
    国庆第五日2014-10-05 10:03,电子书
    truffle框架快速开发合约步骤
  • 原文地址:https://www.cnblogs.com/LM-LBG/p/10645018.html
Copyright © 2011-2022 走看看