Cod sursa(job #1190140)

Utilizator andreiiiiPopa Andrei andreiiii Data 24 mai 2014 16:26:02
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <algorithm>
#include <fstream>
#include <iomanip>
#include <vector>

using namespace std;

const double EPS = 1e-10;

ifstream fin("gauss.in");
ofstream fout("gauss.out");

vector<vector<double>> A;
vector<double> X;

int main()
{
    int N, M;
    fin >> N >> M;

    A = vector<vector<double>>(N, vector<double>(M + 1));
    X = vector<double>(M);

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

    for (int i = 0, j = 0; i < N && j < M; i++, j++)
    {
        int k;
        for (k = i; k < N; k++)
            if (A[k][j] > EPS || A[k][j] < -EPS)
                break;

        if (k == N)
        {
            i--;
            continue;
        }

        if (i != k)
            swap(A[i], A[k]);

        for (int k = j + 1; k <= M; k++)
            A[i][k] /= A[i][j];
        A[i][j] = 1;

        for (int k = i + 1; k < N; k++)
        {
            for (int p = j + 1; p <= M; p++)
                A[k][p] -= A[k][j] * A[i][p];

            A[k][j] = 0;
        }

    }

    for (int i = N - 1; i >= 0; i--)
    {
        for (int j = 0; j <= M; j++)
        {
            if(A[i][j] > EPS || A[i][j] < -EPS)
            {
                if (j == M)
                {
                    fout << "Imposibil\n";
                    return 0;
                }

                X[j] = A[i][M];

                for (int k = j + 1; k < M; k++)
                    X[j] -= A[i][k] * X[k];

                break;
            }
        }
    }

    fout << setprecision(8) << fixed;
    for (int i = 0; i < M; i++)
        fout << X[i] << " ";

    fout << "\n";

    fin.close();
    fout.close();
}