Cod sursa(job #1518252)

Utilizator lflorin29Florin Laiu lflorin29 Data 5 noiembrie 2015 19:36:22
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;

const double epp = 1e-10;

int main() {
    ifstream cin("gauss.in");
    ofstream cout("gauss.out");

    int N, M; cin >> N >> M;
    vector < vector < double >> A(N , vector<double>(M + 1));

    for(int i = 0 ; i < N; ++i)
       for(int j = 0; j <= M; ++j)
          cin >> A[i][j];

    for(int currline = 0, currow = 0; currline < N && currow < M;) {
        int res = -1;
        for(int i = currline; i < N && res == -1; ++i)
            if(abs(A[i][currow]) > epp)
              res = i;
        if(res == -1) {
           ++currow;
           continue;
        }

        if(res != currline)
           for(int j = 0 ; j <= M; ++j)
              swap(A[res][j], A[currline][j]); // swap lines

        for(int j = currow + 1 ; j <= M; ++j)
            A[currline][j] /= A[currline][currow];
        A[currline][currow] = 1; // make the coefficient to 1

        for(int i = currline + 1; i < N; ++i) {
            for(int j = currow + 1; j <= M; ++j)
               A[i][j] -= A[i][currow] * A[currline][j];
            A[i][currow] = 0;
        }
        currline++; currow++;
    }

    vector<double> ret(M);

    for(int i = N - 1; i >= 0; --i)
         for(int j = 0; j <= M; ++j)
             if(abs(A[i][j]) > epp) {
                if(j == M) {
                    cout << "Imposibil";
                    return 0;
                }
                ret[j] = A[i][M];

                for(int k = j + 1; k <= M; ++k)
                   ret[j] -= ret[k] * A[i][k];
                break;
             }
    cout << fixed << setprecision(10);
    for(auto it : ret)
        cout << it << ' ';
    return 0;
}