Cod sursa(job #676675)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 9 februarie 2012 15:11:05
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb

#include <cstdio>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

#define eps 0.0000001

vector<vector<double> > A;
int n,m;
double X[301];

void read ()
{
	vector<double> v;
	ifstream in ("gauss.in");
	in>>n>>m;
	v.resize(m+2);
	A.push_back(v);
	for(int i=1;i<=n;++i)
	{
		A.push_back(v);
		for(int j=1;j<=m+1;++j)
			in>>A[i][j];	
	}
}

void solve ()
{
	for(int i=1,j=1;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;
			continue;
		}
		if(k!=i)
			swap(A[i],A[k]);
		for(k=j+1;k<=m+1;++k)
			A[i][k]=A[i][k]/A[i][j];
		A[i][j]=1;
		for(k=i+1;k<=n;++k)
		{
			for(int l=j+1;l<=m+1;++l)
				A[k][l]-=A[k][j]*A[i][l];
			A[k][j]=0;
		}
		++i;
		++j;
	}
}

void out ()
{
	freopen("gauss.out","w",stdout);
	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)
				{
					printf("Imposibil\n");
					return;
				}
				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)
        printf("%.8lf ", X[i]);
    printf("\n");
}

int main ()
{
	read ();
	solve ();
	out ();
	return 0;
}