zoukankan      html  css  js  c++  java
  • luogu 3389 【模板】高斯消元法

    这个东西的原理就是构造关于这个矩阵的上三角形,使得每一层得第一个非零的变量系数是 $1.$
    而每一层前导零的个数依次加 $1,$ 这样代表着每一层的未知变量数在减少.
    最后求解时自底向上依次消掉一个未知变量即可.

    #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])>fabs(g[now][i])) now=j;   
            for(j=1;j<=n+1;++j) swap(g[now][j],g[i][j]);      
            if(g[i][i]==0) 
            { 
                printf("No Solution
    "); 
                exit(0); 
            } 
            for(j=i+1;j<=n+1;++j) g[i][j]/=g[i][i];                                                                
            g[i][i]=1; 
            for(j=i+1;j<=n;++j) // 枚举第 j 行
            { 
                double div=g[j][i];   
                for(k=i+1;k<=n+1;++k) 
                    g[j][k]-=div*g[i][k]; 
                g[j][i]=0;          
            }
        }  
        for(i=n;i>=1;--i) 
        {
            for(j=i+1;j<=n;++j) 
            {
                g[i][n+1]-=g[i][j]*g[j][n+1];                   
            }
        }
    }
    int main() 
    { 
        int i,j; 
        // setIO("input");  
        scanf("%d",&n);  
        for(i=1;i<=n;++i) 
        {
            for(j=1;j<=n+1;++j) scanf("%lf",&g[i][j]); 
        } 
        Gauss();    
        for(i=1;i<=n;++i) printf("%.2f
    ",g[i][n+1]);   
        return 0; 
    }
    

      

  • 相关阅读:
    接口开发
    操作Excel
    操作mongodb
    sys模块
    操作redis
    操作数据库
    日志生成、发送邮件
    Codeforces Round #487 (Div. 2)
    bitset学习
    Training for 分块&莫队
  • 原文地址:https://www.cnblogs.com/guangheli/p/11517112.html
Copyright © 2011-2022 走看看