Cod sursa(job #3031143)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 18 martie 2023 20:56:11
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
//
// Created by mihai145 on 18.03.2023.
//

#include <iomanip>
#include <fstream>
#include <vector>

using namespace std;

using ld = double;
using mat = vector<vector<ld>>;
const ld EPS = 1e-9;

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

pair<vector<int>, int> RowEchelon(mat &A) {
    int n = (int) A.size(), m = (int) A[0].size(), sgn = 1;
    vector<int> piv;

    for (int i = 0, rnk = 0; i < m && rnk < n; ++i) {
        for (int j = rnk + 1; j < n; ++j) {
            if (abs(A[j][i]) > abs(A[rnk][j])) {
                swap(A[j], A[rnk]);
                sgn *= (-1);
            }
        }

        if (abs(A[rnk][i]) < EPS) continue;

        for (int j = 0; j < n; ++j) {
            ld coef = A[j][i] / A[rnk][i];
            if (j == rnk || abs(coef) < EPS) continue;
            for (int k = 0; k < m; ++k) A[j][k] -= coef * A[rnk][k];
        }

        piv.push_back(i);
        ++rnk;
    }

    return {piv, sgn};
}

vector<ld> SolveLinear(mat &A) {
    int m = (int) A[0].size() - 1;
    auto piv = RowEchelon(A).first;

    if (piv.size() > m) return {};

    vector<ld> sol(m, 0.);
    for (int i = 0; i < (int) piv.size(); ++i) {
        sol[piv[i]] = A[i][m] / A[i][i];
    }
    return sol;
}

int main() {
    int n, m;
    cin >> n >> m;

    vector<vector<ld>> mat(n, vector<ld>(m + 1));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m + 1; j++) cin >> mat[i][j];
    }

    auto sol = SolveLinear(mat);

    if ((int) sol.size() == 0) {
        cout << "Imposibil\n";
    } else {
        for (int i = 0; i < m; i++) {
            cout << fixed << setprecision(8) << sol[i] << ' ';
        }
    }

    return 0;
}