Cod sursa(job #1541519)

Utilizator qcataMihai Catalin qcata Data 4 decembrie 2015 10:36:25
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <cstdio>
#define EPS 0.0000001
#define MAXN 300
#define MAXM 300
double a[MAXN+1][MAXM+2], x[MAXM+1];
int main(){
    int n, m, i, j, p, q, l, f, r;
    double aux;
    FILE *fin, *fout;
    fin=fopen("gauss.in", "r");
    fout=fopen("gauss.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for(i=1; i<=n; i++){
        for(j=1; j<=m+1; j++){
            fscanf(fin, "%lf", &a[i][j]);
        }
    }
    i=1;
    j=1;
    f=1;
    while((i<=n)&&(j<=m)&&(f==1)){
        f=1;
        l=i;
        while((l<=n)&&((a[l][j]<EPS)&&(a[l][j]>-EPS))){
            l++;
        }
        if(l==n+1){
            j++;
            f=0;
        }else{
            if(i!=l){
                for(p=1; p<=m+1; p++){
                    aux=a[i][p];
                    a[i][p]=a[l][p];
                    a[l][p]=aux;
                }
            }
            for(p=j+1; p<=m+1; p++){
                a[i][p]/=a[i][j];
            }
            a[i][j]=1;
            for(p=i+1; p<=n; p++){
                for(q=j+1; q<=m+1; q++){
                    a[p][q]-=a[p][j]*a[i][q];
                }
                a[p][j]=0;
            }
        }
        i++;
        j++;
    }
    r=1;
    i=n;
    while((i>0)&&(r==1)){
        j=1;
        f=1;
        while((j<=m+1)&&(f==1)){
            if((a[i][j]>EPS)||(a[i][j]<-EPS)){
                if(j==m+1){
                    r=0;
                }
                f=0;
                x[j]=a[i][m+1];
                for(l=i+1; l<=m; l++){
                    x[j]-=x[l]*a[i][l];
                }
            }
            j++;
        }
        i--;
    }
    if(r==0){
        fprintf(fout, "Imposibil\n");
    }else{
        for(i=1; i<=m; i++){
            fprintf(fout, "%.8lf ", x[i]);
        }
        fprintf(fout, "\n");
    }
    fclose(fin);
    fclose(fout);
    return 0;