Cod sursa(job #1642479)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 9 martie 2016 14:22:15
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
#include <iomanip>
#include <iostream>
using namespace std;

bool e_zero(const double d){
	return d < 1e-6 && d > -1e-6; }

void do_gauss(const int n_ec, const int n_var, vector<vector<double> >& mat, vector<double>& rez, bool& bad){
	for(int ec = 0, var = 0; ec < n_ec && var < n_var; ){
		{
			int i = ec;
			while(i < n_ec && e_zero(mat[i][ec])){
				++i; }
			if(i == n_ec){
				++var;
				continue; }
			swap(mat[ec], mat[i]); }
		for(int i = ec+1; i < n_ec; ++i){
			const double mult = mat[i][var] / mat[ec][var];
			for(int j = var; j <= n_var; ++j){
			mat[i][j] -= mult * mat[ec][j]; } }
		++var, ++ec; }
	for(int i = 0; i < n_ec; ++i){
		if(all_of(mat[i].begin(), mat[i].begin() + n_var, e_zero) && !e_zero(mat[i].back())){
			bad = true;
			return; } }
	for(int i = n_ec-1; i >= 0; --i){
		int var = 0;
		while(e_zero(mat[i][var]) && var < n_var){
			++var; }
		if(var == n_var){
			continue; }
		for(int j = var+1; j < n_var; ++j){
			rez[var] -= mat[i][j] * rez[j]; }
		rez[var] += mat[i][n_var];
		rez[var] /= mat[i][var]; } }

int main(){
	ifstream f("gauss.in");
	ofstream g("gauss.out");

	int n, m;
	f >> n >> m;

	vector<vector<double> > v(n, vector<double>(m+1, 0));

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

	vector<double> rez(m);
	bool bad = false;

	do_gauss(n, m, v, rez, bad);

	if(bad){
		g << "Imposibil\n";
		return 0; }
	g << fixed << setprecision(10);
	for(int i = 0; i < m; ++i){
		g << rez[i] << ' '; }

	return 0; }