Cod sursa(job #2744244)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 24 aprilie 2021 10:05:56
Problema Algoritmul lui Gauss Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cassert>

using namespace std;

typedef long double ld;
const int N = 300 + 7;
int n, m, pi[N], pj[N];
ld a[N][N];

int main() {
  freopen ("gauss.in", "r", stdin);
  freopen ("gauss.out", "w", stdout);

  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m + 1; j++) {
      cin >> a[i][j];
    }
  }
  for (int i = 0; i < N; i++) {
    pi[i] = -1;
    pj[i] = -1;
  }
  for (int j = 1; j <= m; j++) {
    ld mx = -1;
    int k = -1;
    for (int i = 1; i <= n; i++) {
      if (fabs(a[i][j]) > mx && pi[i] == -1) {
        k = i;
        mx = fabs(a[i][j]);
      }
    }
    if (k == -1) {  /// toate de pe coloana asta au valoarea 0
      continue;
    }
    pi[k] = j;
    pj[j] = k;
    for (int i = 1; i <= n; i++) {
      if (i != k && fabs(a[i][j]) > 0) {
        ld coef = a[i][j] / a[k][j];
        for (int col = 1; col <= m + 1; col++) {
          a[i][col] -= coef * a[k][col];
        }
        assert(a[i][j] == 0);
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (!pi[i] && fabs(a[i][m + 1]) > 0) {
      cout << "Imposibil\n";
      return 0;
    }
  }
  for (int j = 1; j <= m; j++) {
    ld sol = 0;
    if (pj[j] != -1) {
      sol = a[pj[j]][m + 1] / a[pj[j]][j];
    }
    cout << fixed << setprecision(6) << sol << " ";
  }
  cout << "\n";
  return 0;
}