Cod sursa(job #822654)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 23 noiembrie 2012 21:06:35
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <iomanip>
#include <iostream>
#include <vector>

using namespace std;

const double eps = 1e-9;

int N, M;

int main() {
	ifstream cin("gauss.in");
	ofstream cout("gauss.out");
	cin >> N >> M;
	vector<vector<double> > A(N + 1, vector<double> (M + 2, 0));
	vector<double> X(M + 2, 0);
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M + 1; j++) {
			cin >> A[i][j];
		}
	}
	int i = 1, j = 1, k;
	while (i <= N && j <= M) {
		for (k = i; k <= N; k++) {
			if (A[k][j] < -eps || eps < A[k][j]) {
				break;
			}
		}
		if (k == N + 1) {
			j++;
			continue;
		}
		if (k != i) {
			swap(A[i], A[k]);
		}
		for (int l = j + 1; l <= M + 1; l++) {
			A[i][l] = A[i][l] / A[i][j];
		}
		A[i][j] = 1;
		for (int u = i + 1; u <= N; ++u) {
			for (int l = j + 1; l <= M + 1; l++) {
				A[u][l] -= A[u][j] * A[i][l];
			}
			A[u][j] = 0;
		}
		i++;
		j++;
	}
	for (int i = N; i > 0; i--) {
		for (int j = 1; j <= M + 1; j++) {
			if (A[i][j] < -eps || eps < A[i][j]) {
				if (j == M + 1) {
					cout << "Imposibil";
					return 0;
				}
				X[j] = A[i][M + 1];
				for (int k = j + 1; k <= M; k++) {
					X[j] -= X[k] * A[i][k];
				}
				break;
			}
		}
	}
	for (int i = 1; i <= M; i++) {
		cout << fixed << setprecision(8) << X[i] << " ";
	}
	return 0;
}