Cod sursa(job #713642)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 14 martie 2012 20:09:01
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<cstdio>
#define eps 0.0000000001
#define nmax 305
using namespace std;
double x[nmax][nmax], *a[nmax],*aux;
int n,m,next[nmax],prev[nmax],OK=1,l,sol[nmax];
void citire()
{
	int i,j;
	freopen("gauss.in","r",stdin);
	freopen("gauss.out","w",stdout);
	scanf("%d%d", &n, &m);
	for(i=1;i<=n;i++)
	{
		a[i]=x[i];
		for(j=1;j<=m+1;j++)
			scanf("%lf", &a[i][j]);
	}
}
void initializare()
{
	int i;
	for(i=1;i<=m+1;i++)
	{
		next[i]=i+1;
		prev[i]=i-1;
	}
	next[0]=1;
	prev[m+2]=m+1;
}
int valid()
{
	int c,j,k;
	double val;
	for(c=next[0];c<=m+1;c=next[c])
		if(a[l][c]<=-eps||a[l][c]>=eps)
			break;
	if(c==(m+2))
	{
		aux=a[l];
		a[l]=a[n];
		a[l]=aux;
		n--;
		l--;
		return 1;
	}
	if(c==(m+1))
		return 0;
	val=a[l][c];
	for(j=c;j<=m+1;j=next[j])
		a[l][j]/=val;
	for(j=1;j<=n;j++)
		if(j!=l)
		{
			val=a[j][c];
			if(val<=eps&&val>=-eps)
				continue;
			for(k=c;k<=m+1;k=next[k])
				a[j][k]=a[j][k]-val*a[l][k];
		}
	sol[c]=l;
	next[prev[c]]=next[c];
	prev[next[c]]=prev[c];
	return 1;
}
void rezolvare()
{
	for(l=1;l<=n;l++)
	{
		if(valid())
			continue;
		OK=0;
		return;
	}
}
void afisare()
{
	int i;
	if(OK==1)
		for(i=1;i<=m;i++)
		{
			if(sol[i]!=0)
				printf("%.8lf ", x[sol[i]][m+1]);
			else
				printf("0.00000000 ");
		}
	else
		printf("Imposibil");
}
int main()
{
	citire();
	initializare();
	rezolvare();
	afisare();
	return 0;
}