Cod sursa(job #717025)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 19 martie 2012 15:52:15
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;

const int dim = 305;
const double e = 0.0000001;
int N, M, viz[dim];
double A[dim][dim], X[dim];

void cit ()
{
	scanf ("%d%d", &N, &M);
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= M + 1; j++)
			scanf ("%lf", &A[i][j]);	
}

void gauss ()
{
	int i, j, n, m;
	
	for (i = j = 1; i <= N && j <= M; i++, j++)
	{
		for (n = i; n <= N && A[n][j] > -e && A[n][j] < e; n++);
		if (n > N)
		{
			i--;
			continue;
		}
		for (m = j; m <= M + 1; m++) 
			swap (A[i][m], A[n][m]);
		
		for (n = i; n <= N; n++)
		{
			if (A[n][j] != 0)
			{
				for (m = j + 1; m <= M + 1; m++)
					A[n][m] /= A[n][j];
				A[n][j] = 1;
				
				if (n != i)
				{
					for (m = j; m <= M + 1; m++)	
						A[n][m] -= A[i][m];
				}
			}
		}
	}
	
	for (i = N; i >= 1; i--)
	{
		m = 0;
		for (j = 1; j <= M; j++)
		{
			if (A[i][j] > -e && A[i][j] < e)
				continue;
			
			if (viz[j])
				A[i][j] *= X[j];
			else
			{
				if (m == 0)
					m = j;
				else
				{
					X[j] = 0;
					A[i][j] = 0;
					viz[j] = 1;
				}
			}
		}
		
		for (j = 1; j <= M; j++)
			if (j != m)
				A[i][M+1] -= A[i][j];
		if (m == 0)
		{
			if (!(A[i][M+1] > -e && A[i][M+1] < e))
			{
				printf ("Imposibil");
				return;
			}
		}
		else
		{
			X[m] = A[i][M+1] / A[i][m];
			A[i][m] = 0;
			viz[m] = 1;
		}
	}
	
	for (int i = 1; i <= M; i++)
		printf ("%.8lf ", X[i]);
}

int main ()
{
	freopen ("gauss.in", "r", stdin);
	freopen ("gauss.out", "w", stdout);
	
	cit ();
	gauss ();
	
	return 0;
}