Cod sursa(job #1165165)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 2 aprilie 2014 15:31:11
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <cmath>

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

using namespace std;

const double EPS = 1e-8;

int N, M;
vector< vector<double> > A;
vector<double> Solution;
bool Compatible;

vector<double> Gauss(vector< vector<double> > a, bool &compatible) {
    int n = int(a.size()), m = int(a[0].size()) - 1;
    for (int i = 0, j = 0; i < n && j < m; ++i, ++j) {
        int k = i;
        for (; abs(a[k][j]) < EPS; ++k);
        if (k == n) {
            --i;
            continue;
        }
        swap(a[i], a[k]);
        for (k = 0; k < n; ++k) {
            if (i == k)
                continue;
            double ratio = a[k][j] / a[i][j];
            for (int l = 0; l <= m; ++l)
                a[k][l] -= a[i][l] * ratio;
            a[k][j] = 0.0;
        }
    }
    compatible = true;
    vector<double> solution = vector<double>(m, 0.0);
    for (int i = n - 1, j; i >= 0; --i) {
        for (j = 0; j <= m && abs(a[i][j]) < EPS; ++j);
        if (j == m) {
            compatible = false;
            return vector<double>(m, 0.0);
        }
        solution[j] = a[i][m] / a[i][j];
        for (int k = 0; k < i; ++k) {
            a[k][m] -= a[k][j] * solution[j];
            a[k][j] = 0.0;
        }
    }
    return solution;
}

void Solve() {
    Solution = Gauss(A, Compatible);
}

void Read() {
    ifstream cin("gauss.in");
    cin >> N >> M;
    A = vector< vector<double> >(N, vector<double>(M + 1, 0.0));
    for (int i = 0; i < N; ++i)
        for (int j = 0; j <= M; ++j)
            cin >> A[i][j];
    cin.close();
}

void Print() {
    ofstream cout("gauss.out");
    if (!Compatible) {
        cout << "Imposibil\n";
    } else {
        for (int i = 0; i < M; ++i)
            cout << fixed << setprecision(10) << Solution[i] << " ";
        cout << "\n";
    }
    cout.close();
}

int main() {
    Read();
    Solve();
    Print();
    return 0;
}