Cod sursa(job #2730971)

Utilizator vlad082002Ciocoiu Vlad vlad082002 Data 27 martie 2021 10:06:02
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
using namespace std;

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

const double eps = 0.0000001;
int n, m;

int main() {
    fin >> n >> m;
    vector<vector<double> > sist(n, vector<double> (m+1));
    for(int i = 0; i < n; i++)
        for(int j = 0; j <= m; j++)
            fin >> sist[i][j];

    int i = 0, j = 0;
    while(i < n && j < m) {
        int k = n;
        for(int ec = i; ec < n; ec++)
            if(sist[ec][j] < -eps || sist[ec][j] > eps) {
                k = ec;
                break;
            }
        if(k == n) {
            j++;
            continue;
        }

        for(int l = 0; l <= m; l++)
            swap(sist[i][l], sist[k][l]);
        for(int l = j+1; l <= m; l++)
            sist[i][l] /= sist[i][j];
        sist[i][j] = 1;

        for(int u = i+1; u < n; u++) {
            for(int l = j+1; l <= m; l++)
                sist[u][l] -= sist[i][l]*sist[u][j];
            sist[u][j] = 0;
        }
        i++, j++;
    }

    vector<double> ans(m);
    for(int u = n-1; u >= 0; u--)
        for(int v = 0; v <= m; v++)
            if(sist[u][v] < -eps || sist[u][v] > eps) {
                if(v == m) {
                    fout << "Imposibil\n";
                    return 0;
                }
                ans[v] = sist[u][m];
                for(int j = v+1; j < m; j++)
                    ans[v] -= ans[j]*sist[u][j];
                break;
            }
    for(int i = 0; i < m; i++)
        fout << fixed << setprecision(10) << ans[i] << ' ';
}