Cod sursa(job #2436919)

Utilizator HumikoPostu Alexandru Humiko Data 7 iulie 2019 17:18:03
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <cstring>
#include <iomanip>

using namespace std;

//#include <iostream>
#include <fstream>

//ifstream cin ("input.in");
//ofstream cout ("output.out");

ifstream cin ("gauss.in");
ofstream cout ("gauss.out");

static const double lim = 0.0000001;
static const int NMAX = 305;

int n, m;
double ans[NMAX];
double v[NMAX][NMAX];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	cin>>n>>m;
	for ( int i = 1; i <= n; ++i ) {
		for ( int j = 1; j <= m+1; ++j ) {
			cin>>v[i][j];
		}
	}

	int i = 1, j = 1;

	while ( i <= n && j <= m ) {
		bool swapped = false;
		int x;

		for ( x = i; x <= n; ++x ) {
			if ( v[x][j] >= lim || v[x][j] <= -lim ) {
				swapped = true;
				break;
			} 
		}

		if ( swapped ) {
			for ( int k = j; k <= m+1; ++k ) {
				swap(v[i][k], v[x][k]);
			}

			double aux = v[i][j];

			for ( int k = j; k <= m+1; ++k ) {
				v[i][k] /= aux;
			}

			for ( int u = i+1; u <= n; ++u ) {
				aux = v[u][j];

				for ( int k = j; k <= m+1; ++k ) {
					v[u][k] -= aux*v[i][k];
				}
			}

			i++;
			j++;

		}
		else {
			j++;
		}
	}

	for ( int i = n; i >= 1; --i ) {
		for ( int j = 1; j <= m+1; ++j ) {
			if ( v[i][j] >= lim || v[i][j] <= -lim ) {
				if ( j == m+1 ) {
					cout<<"Imposibil"<<'\n';
					return 0;
				}

				ans[j] = v[i][m+1];

				for ( int x = m; x > j; --x ) {
					ans[j] -= ans[x]*v[i][x];
				}

				break;
			}
		}
	}

	for ( int i = 1; i <= m; ++i ) {
		cout<<fixed<<setprecision(12)<<ans[i]<<" ";
	}
}