Cod sursa(job #2409238)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 18 aprilie 2019 20:08:53
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 300;
const double eps = 1e-8;

vector<vector<double>> a;

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

  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) {
    vector<double>v(m + 1);
    for (int i = 0; i <= m; ++i) {
      int x;
      scanf("%d", &x);
      v[i] = x;
    }
    a.push_back(v);
  }

  vector<double>ans(m);
  vector<int>p(m, -1);
  int k = 0;
  for (int i = 0; i < m && k < n; ++i) {
    int pos = k;
    for (int j = k + 1; j < n; ++j)
      if (fabs(a[j][i]) > fabs(a[pos][i]))
        pos = j;
    if (fabs(a[pos][i]) < eps)
      continue;
    swap(a[k], a[pos]);
    double coef = 1. / a[k][i];
    for (int j = i; j <= m; ++j)
      a[k][j] *= coef;
    for (int j = 0; j < n; ++j)
      if (j != k) {
        coef = a[j][i];
        for (int t = i; t <= m; ++t)
          a[j][t] -= a[k][t] * coef;
      }
    /*cerr << "------>" << i << '\n';
    for (auto it:a) {
      for (auto it1:it)
        cerr << it1 << ' ';
      cerr << '\n';
    }
    cerr << '\n';*/
    p[i] = k;
    k++;
  }

  for (int i = k; i < n; ++i)
    if (fabs(a[i][m]) <= eps) {
      printf("Imposibil!");
      return 0;
    }

  for (int i = 0; i < m; ++i)
    if (p[i] != -1)
      ans[i] = a[p[i]][m];

  for (auto it:ans)
    cout << it << ' ';

  return 0;
}