Cod sursa(job #2692728)

Utilizator retrogradLucian Bicsi retrograd Data 3 ianuarie 2021 16:12:23
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;
using ld = double;
const ld EPS = 1e-9;

vector<int> RowEchelon(vector<vector<ld>>& A) {
  int n = A.size(), m = A[0].size();
  vector<int> piv;

  for (int i = 0, rnk = 0; i < m && rnk < n; ++i) {
    for (int j = rnk + 1; j < n; ++j) 
      if (abs(A[j][i]) > abs(A[rnk][i]))
        swap(A[j], A[rnk]);
    ld coef = A[rnk][i];
    if (abs(coef) < EPS) continue;
    for (int j = 0; j < m; ++j) A[rnk][j] /= coef;
    for (int j = 0; j < n; ++j) {
      if (j == rnk) continue;
      coef = A[j][i];
      for (int k = 0; k < m; ++k)
        A[j][k] -= coef * A[rnk][k];
    }
    piv.push_back(i); ++rnk;
  }
  return piv;
}

vector<ld> SolveLinear(vector<vector<ld>>& A) {
  int m = A[0].size() - 1;
  auto piv = RowEchelon(A);
  if (piv.size() > m) return {};
  vector<ld> sol(m, 0.);
  for (int i = 0; i < (int)piv.size(); ++i)
    sol[piv[i]] = A[i][m];
  return sol;
}

int main() {
  ifstream cin("gauss.in");
  ofstream cout("gauss.out");
  
  int n, m; cin >> n >> m;
  vector<vector<ld>> A(n, vector<ld>(m + 1));
  for (auto& row : A) for (auto& x : row) cin >> x;
  auto sol = SolveLinear(A);
  if (sol.empty()) cout << "Imposibil";
  else for (auto x : sol) cout << fixed << setprecision(20) << x << " ";
  cout << endl;

  return 0;
}