Cod sursa(job #2300371)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 11 decembrie 2018 11:14:36
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

vector <vector<double>> mat;
vector <double> sol;
const double eps = 1e-9;

inline double myabs(double x){
  if(x < 0)
    return -x;
  return x;
}

int main()
{
  int n, m, i, j;
  ifstream fin("gauss.in");
  ofstream fout("gauss.out");
  fin >> n >> m;
  mat.resize(n);
  sol.resize(m);
  for(i = 0; i < n; i++)
    mat[i].resize(m + 1);
  for(i = 0; i < n; i++){
    for(j = 0; j <= m; j++){
      fin >> mat[i][j];
      //cout << mat[i][j] << ' ';
    }
    //cout << '\n';
  }
  int l = 0, c = 0;
  while(l < n && c < m){
    i = l;
    while(i < n && myabs(mat[i][c]) < eps)
      i++;
    if(i == n)
      c++;
    else{
      for(j = c; j <= m; j++)
        swap(mat[i][j], mat[l][j]);
      for(j = c + 1; j <= m; j++)
        mat[l][j] /= mat[l][c];
      mat[l][c] = 1;
      for(i = l + 1; i < n; i++){
        for(j = c + 1; j <= m; j++)
          mat[i][j] -= mat[i][c] * mat[l][j];
        mat[i][c] = 0;
      }
      l++;
      c++;
    }

  }
  for(i = n - 1; i >= 0; i--){
    j = 0;
    while(j < m && myabs(mat[i][j]) < eps)
      j++;
    if(j == m){
      if(myabs(mat[i][j]) > eps){
        fout << "Imposibil";
        return 0;
      }
    }
    else{
      for(int p = j + 1; p <= c; p++)
        mat[i][m] -= sol[p] * mat[i][p];
      sol[j] = mat[i][m];
    }
  }
  fout.precision(8);
  for(i = 0; i < m; i++)
    fout << fixed << sol[i] << ' ';
  fin.close();
  fout.close();
  return 0;
}