Cod sursa(job #676689)

Utilizator dacyanMujdar Dacian dacyan Data 9 februarie 2012 15:29:22
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <iomanip>
#define DIM 301
#define EPS 0.00000001
using namespace std;

ofstream fout("gauss.out");

int n, m;
vector<vector<double> > a;
vector<double > sol;
bool imposibil;

void Read();
void Gauss();
void Write();

int main()
{
	Read();
	Gauss();
	Write();
	return 0;
}

void Read()
{
	ifstream fin("gauss.in");
	fin >> n >> m;
	a.resize(n+1);
	sol.resize(m+1);
	for (int i = 1; i <= n; ++i)
	{
		a[i].resize(m+2);
		for (int j = 1; j <= m + 1; ++j)
			fin >> a[i][j];
	}
	fin.close();
}


void Gauss()
{
	int i(1), j(1);
	while (i <= n && j <= m)
	{
		int k;
		for (k = i; k <= n; ++k)
			if (a[k][j] < -EPS || a[k][j] > EPS)
				break;
		if (k == n + 1)
		{
			j++; // j - var libera
			continue;
		}
		
		if (i != k) swap(a[i], a[k]);
		
		
		for (int k = j + 1; k <= m + 1; ++k)
			a[i][k]  = a[i][k] / a[i][j];
		a[i][j] = 1;
		
		for (int ec = i + 1;  ec <= n; ++ec)
		{
			for (int var = j + 1; var <= m + 1; ++var)
				a[ec][var] = a[ec][var] - a[i][var] * a[ec][j];
			a[ec][j] = 0;
		}
		
		i++; j++;
	}
/*	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= m + 1; ++j)
			fout << fixed << setprecision(8) << a[i][j] << ' ';
		fout << '\n';
	}*/
	for (int i = n; i > 0; --i)
		for (int j = 1; j <= m + 1; ++j)
			if (a[i][j] < -EPS || a[i][j] > EPS)
			{
				if (j == m+1) 
				{
					imposibil = true;
					return;
				}
				sol[j] = a[i][m+1];
				for (int var = j + 1; var <= m; ++var)
					sol[j] -= a[i][var] * sol[var];
				break;
			}
}

void Write()
{
	//ofstream fout("gauss.out");
	if (imposibil) fout << "imposibil\n";
	else
		for (int i = 1; i <= n; ++i)
			fout << fixed << setprecision(8) << sol[i] << ' ';
	fout.close();
}