Cod sursa(job #1364555)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 27 februarie 2015 18:36:19
Problema Algoritmul lui Gauss Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<cstdio>
#include<string>
#include<cmath>

using namespace std;

#ifdef HOME
const string inputFile = "input.txt";
const string outputFile = "output.txt";
#else
const string problemName = "gauss";
const string inputFile = problemName + ".in";
const string outputFile = problemName + ".out";
#endif

const int NMAX = 300 + 5;
const double EPS = 1e-16;

int N, M;
double A[NMAX][NMAX];
double B[NMAX];

void gauss() {
    int i, j, k, l;

    for(j = 1; i <= M; j++) {
        for(i = j; i <= N; i++)
            if(fabs(A[i][j]) > EPS)
                break;

        if(i > N)
            continue;

        for(k = i + 1; k <= N; k++) {
            B[k] -= B[i] * A[k][j] / A[i][j];
            for(l = M; l >= j; l--)
                A[k][l] -= A[i][l] * A[k][j] / A[i][j];
        }

        B[i] /= A[i][j];
        for(k = M; k >= j; k--)
            A[i][k] /= A[i][j];
    }
}

int solve() {
    int i, j, k;

    for(i = N; i >= 1; i--) {
        for(k = i; k <= M; k++)
            if(fabs(A[i][k]) > EPS)
                break;

        for(j = M; j >= k + 1; j--)
            B[i] -= B[j] * A[i][j];

        if(fabs(A[i][k]) < EPS && fabs(B[i]) > EPS)
            return 0;

        if(fabs(A[i][k]) > EPS)
            B[k] = B[i] / A[i][j];
    }

    return 1;
}

int main() {
    int i, j;

    freopen(inputFile.c_str(), "r", stdin);
    freopen(outputFile.c_str(), "w", stdout);

    scanf("%d%d", &N, &M);

    for(i = 1; i <= N; i++) {
        for(j = 1; j <= M; j++)
            scanf("%lf", &A[i][j]);
        scanf("%lf", &B[i]);
    }

    gauss();

    if(solve())
        for(i = 1; i <= M; i++)
            printf("%.10f ", B[i]);
    else
        printf("Imposibil\n");

    return 0;
}