Cod sursa(job #1802285)

Utilizator retrogradLucian Bicsi retrograd Data 10 noiembrie 2016 01:12:08
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

vector<double> operator+(vector<double> a, vector<double> b) {
	for(int i = 0; i < a.size(); ++i)
		a[i] += b[i];
	return a;
}
vector<double> operator*(vector<double> a, double lambda) {
	for(int i = 0; i < a.size(); ++i)
		a[i] *= lambda;
	return a;
}

vector<double> Gauss(vector<vector<double>> Mat) {
	int at = 0;

	int n = Mat.size();
	int m = Mat[0].size() - 1;

	for(int it = 0; it <= m; ++it) {
		if(at == n) break;
		if(it == m) return vector<double>();

		for(int i = at; i < n; ++i)
			if(abs(Mat[i][it]) > 1e-9) {
				swap(Mat[i], Mat[at]);
			}

		if(abs(Mat[at][it]) > 1e-9) {
			Mat[at] = Mat[at] * (1.0 / Mat[at][it]);

			for(int i = 0; i < n; ++i)
				if(i != at) {
					Mat[i] = Mat[i] + Mat[at] * (-Mat[i][it]);
					assert(abs(Mat[i][it]) < 1e-9);
				}
			++at;
		}
	}

	vector<double> ret(m);
	for(int it = 0; it < m; ++it) {
		for(int i = 0; i < n; ++i)
			if(Mat[i][it] > 1e-9)
				ret[it] = Mat[i][m];
	}
	return ret;

}

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

	vector<vector<double>> Mat(n, vector<double>(m + 1));
	for(int i = 0; i < n; ++i)
		for(int j = 0; j <= m; ++j)
			cin >> Mat[i][j];

	cout << fixed << setprecision(12);

	auto ret = Gauss(Mat);
	if(ret.empty()) {
		cout << "Imposibil" << endl;
	} else {
		for(int i = 0; i < m; ++i)
			cout << ret[i] << " ";
		cout << endl;
	}
	return 0;
}