Cod sursa(job #1218327)

Utilizator xtreme77Patrick Sava xtreme77 Data 10 august 2014 15:25:43
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
#include <algorithm>
#include <iomanip>

#define rint register int
#define EPS 0.0000001

const char IN [ ] = "gauss.in" ;
const char OUT [ ] = "gauss.out" ;
const int MAX = 314 ;

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

double mat [ MAX ] [ MAX ] , sol [ MAX ] ;

inline void inter ( int i , int j , int m )
{
    for ( rint k = 1 ; k <= m + 1 ; ++ k )
        swap ( mat [ i ] [ k ] , mat [ j ] [ k ] ) ;
}
int main( )
{
    int n , m ;
    fin >> n >> m ;
    for ( rint i = 1 ; i <= n ; ++ i )
        for ( rint j = 1 ; j <= m + 1 ; ++ j )
            fin >> mat [ i ] [ j ] ;
    int i = 1 , j = 1 , k ;
    while ( i <= n and j <= m )
    {
        for ( k = i ; k <= n ; ++ k )
            if ( mat [ k ] [ j ] < -EPS or mat [ k ] [ j ] > EPS )
                break ;
        if ( k == n + 1 ){
            ++ j ;
            continue;
        }
        else if ( i != k ) swap ( i , k ) ;
        for ( rint z = j + 1  ; z <= m + 1 ; ++ z )
            mat [ i ] [ z ] = mat [ i ] [ z ] / mat [ i ] [ j ] ;
        mat [ i ] [ j ] = 1 ;
        for ( rint u = i + 1 ; u <= n ; ++ u )
        {
            for ( rint z = j + 1 ; z <= m + 1 ; ++ z )
                mat [ u ] [ z ] -= mat [ u ] [ j ] * mat [ i ] [ z ] ;
            mat [ u ] [ j ] = 0 ;
        }
        ++ i , ++ j ;

    }
    for ( i = n ; i >= 1 ; -- i )
        for ( j = 1 ; j <= m + 1 ; ++ j )
            if ( mat [ i ] [ j ] < -EPS or mat [ i ] [ j ] > EPS ){
                if ( j == m + 1 )
                {
                 fout << "Imposibil" << '\n' ;
                 return 0 ;
                }
                sol [ j ] = mat [ i ] [ m + 1 ] ;
                for ( k = j + 1 ; k <= m ; ++ k )
                    sol [ j ] -= sol [ k ] * mat [ i ] [ k ] ;
                break ;
            }
    for ( j = 1 ; j <= m ; ++ j)
        fout << fixed << setprecision( 8 ) << sol [ j ] << ' ' ;
    return 0;
}