zoukankan      html  css  js  c++  java
  • P2455 [SDOI2006]线性方程组(real gauss)

    P2455 [SDOI2006]线性方程组

    (upd 2018.11.08: 这才是真正的高斯消元模板)

    找到所消未知数(设为x)系数最大的式子,把它提上来

    把这个式子的 x 系数约成1

    把这个式子用来把其他式子的x消掉

    重复直到只剩一个未知数,然后往回带

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    using namespace std;
    typedef double db;
    db fabs(db a){return a<0?-a:a;}
    const db eps=1e-7;
    #define N 103
    db a[N][N],sol[N];int n,k1,k2;
    void check(){
        for(int i=1,j;i<=n;++i){
            for(j=1;fabs(a[i][j])<eps&&j<=n+1;++j);
            if(j>n+1) k2=1;
            if(j==n+1) k1=1;
        }
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n+1;++j)
                scanf("%lf",&a[i][j]);
        for(int i=1,x;i<=n;++i){
            x=i;
            for(int j=i+1;j<=n;++j)
                if(fabs(a[j][i])>fabs(a[x][i])) x=j;
            if(x!=i) swap(a[i],a[x]);
            if(fabs(a[i][i])<eps) continue;
            for(int j=1;j<=n;++j){
                if(i==j) continue;
                db div=a[j][i]/a[i][i];
                for(int u=i;u<=n+1;++u)
                    a[j][u]-=a[i][u]*div;//
            }
        }check();
        if(k1){printf("-1");return 0;}//判断无解要在无穷解前面
        if(k2){printf("0");return 0;}
        for(int i=n;i;--i){
            sol[i]=a[i][n+1];
            for(int j=n;j>i;--j)
                sol[i]-=a[i][j]*sol[j];
            sol[i]/=a[i][i];
        }
        for(int i=1;i<=n;++i){
            printf("x%d=%.2lf
    ",i,sol[i]+eps);//防止-0.00出现
        }return 0;
    }
  • 相关阅读:
    [BJOI2015]树的同构 && 树哈希教程
    「HNOI2014」世界树
    CF613D Kingdom and its Cities
    「HEOI2014」大工程
    虚树教程
    [SDOI2011]消耗战
    CF1216E Numerical Sequence
    vim8.1安装
    luoguP5024 保卫王国
    动态DP教程
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/9640118.html
Copyright © 2011-2022 走看看