Cod sursa(job #3357400)

Utilizator CarenaMironov Cezar Luca Carena Data 9 iunie 2026 12:15:51
Problema Algoritmul lui Gauss Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <iomanip>
#include <vector>

using namespace std;

ifstream in("gauss.in");
ofstream out("gauss.out");

const double EPSMAX=1e-8, EPSMIN=1e-6;
int n, m;
vector<vector<double>> a;
vector<double> b, sol;
vector<int> poz;

bool gauss()
{
    sol.assign(m, 0);
    poz.assign(m, -1);
    int j=0, i=0;
    for(;i<n && j<m;j++)
    {
        int maxi=i;
        for(int ii=i;ii<n;ii++)
            if(abs(a[ii][j])>abs(a[maxi][j]))
                maxi=ii;
        if(abs(a[maxi][j])<EPSMAX)
            continue;
        swap(a[i], a[maxi]);
        swap(b[i], b[maxi]);
        poz[j]=i;
        
        for(int ii=0;ii<n;ii++)
            if(ii!=i)
            {
                double q=a[ii][j]/a[i][j];
                for(int jj=0;jj<m;jj++)
                    a[ii][jj]-=q*a[i][jj];
                b[ii]-=q*b[i];
            }
        i++;
    }
    for(j=0;j<m;j++)
        if(poz[j]!=-1)
            sol[j]=b[poz[j]]/a[poz[j]][j];
    
    for(i=0;i<n;i++)
    {
        double sum=0;
        for(j=0;j<m;j++)
            sum+=a[i][j]*sol[j];
        if(abs(sum-b[i])>EPSMIN)
            return 0;
    }
    return 1;
}

int main()
{
    in>>n>>m;
    a.resize(n); b.resize(n);
    for(int i=0;i<n;i++)
    {
        a[i].resize(m);
        for(int j=0;j<m;j++)
            in>>a[i][j];
        in>>b[i];
    }
    if(!gauss())
    {
        out<<"Imposibil";
        return 0;
    }
    for(int j=0;j<m;j++)
        out<<fixed<<setprecision(10)<<sol[j]<<" ";
    return 0;
}