Cod sursa(job #1970523)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 19 aprilie 2017 13:46:17
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>

using namespace std;

#define FILE_IO

class Gauss
{
public:
    const double eps = 1e-7;
    int N, M;
    vector < vector<double> > g;
    vector <double> ans;
    int ok;

    Gauss() {N = M = 0;}
    Gauss(int _N, int _M)
    {
        N = _N, M = _M;
        g.resize(N + 5);
        for(int i = 0; i < g.size(); i++)   g[i].resize(M + 5);
        ans.resize(M + 5);
    }

    void solve()
    {
        ok = 1;
        vector <int> p(N + 5);
        for(int i = 0; i < N; i++)
        {
            for(p[i] = 0; p[i] <= M && fabs(g[i][ p[i] ]) <= eps; p[i]++);

            if(p[i] == M) {ok = 0; return;}
            if(p[i] == M + 1)   continue;

            for(int j = 0; j < N; j++)
                if( fabs(g[j][ p[i] ]) > eps && i != j )
                {
                    double rap = -(g[j][ p[i] ] / g[i][ p[i] ]);
                    for(int k = 0; k <= M; k++)
                        g[j][k] += g[i][k] * rap;
                }
        }

        for(int i = 0; i < M; i++)  ans[i] = 0.0;
        for(int i = 0; i < N; i++)
            if(p[i] < M)
                ans[ p[i] ] = g[i][M] / g[i][ p[i] ];
    }
};

int main()
{
    #ifdef FILE_IO
    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);
    #endif

    int N, M;
    cin >> N >> M;
    Gauss gss(N, M);
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= M + 1; j++)
        {
            double x;
            cin >> x;
            gss.g[i - 1][j - 1] = x;
        }

    gss.solve();
    if(!gss.ok) {printf("Imposibil"); return 0;}

    for(int i = 0; i < M; i++)
        cout << fixed << setprecision(8) << gss.ans[i] << " ";

    return 0;
}