Cod sursa(job #831403)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 8 decembrie 2012 16:49:28
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <iomanip>
#include <iostream>
#include <vector>

using namespace std;

const double eps = 1e-9;

int N, M;

int main() {
    ifstream cin("gauss.in");
    ofstream cout("gauss.out");
    cin >> N >> M;
    vector<vector<double> > A(N + 1, vector<double> (M + 2, 0));
    vector<double> X(M + 2, 0);
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M + 1; j++) {
            cin >> A[i][j];
        }
    }
    int i = 1, j = 1, k;
    while (i <= N && j <= M) {
        for (k = i; k <= N; k++) {
            if (A[k][j] < -eps || eps < A[k][j]) {
                break;
            }
        }
        if (k == N + 1) {
            j++;
            continue;
        }
        if (k != i) {
            swap(A[i], A[k]);
        }
        for (int l = j + 1; l <= M + 1; l++) {
            A[i][l] = A[i][l] / A[i][j];
        }
        A[i][j] = 1;
        for (int u = i + 1; u <= N; ++u) {
            for (int l = j + 1; l <= M + 1; l++) {
                A[u][l] -= A[u][j] * A[i][l];
            }
            A[u][j] = 0;
        }
        i++;
        j++;
    }
    for (int i = N; i > 0; i--) {
        for (int j = 1; j <= M + 1; j++) {
            if (A[i][j] < -eps || eps < A[i][j]) {
                if (j == M + 1) {
                    cout<<"Imposibil";
                    return 0;
                }
                X[j] = A[i][M + 1];
                for (int k = j + 1; k <= M; k++) {
                    X[j] -= X[k] * A[i][k];
                }
                break;
            }
        }
    }
    for (int i = 1; i <= M; i++) {
        cout << fixed << setprecision(8) << X[i] << " ";
    }
    return 0;
}