Cod sursa(job #1675314)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 5 aprilie 2016 11:29:17
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <cstdio>
#define EPS 0.00000001
#define MAXN 255
int n;
double a[MAXN+1][MAXN+2], r[MAXN+1];
inline bool zero(double x){
    if(x<0)return -EPS<x;
    else return x<EPS;
}
inline void adauga(int x, int y, int z){
    if(x<n){
        a[x][y]--;
        a[x][x]++;
        a[x][n+1]+=z;
    }
}
inline void gauss(){
    int i, j, k, p, f;
    double aux;
    i=1;
    j=1;
    while((i<=n)&&(j<=n)){
        k=i;
        while((k<=n)&&(zero(a[k][j]))){
            k++;
        }
        if(k<=n){
            if(i!=k){
                for(p=1; p<=n+1; p++){
                    aux=a[i][p];
                    a[i][p]=a[k][p];
                    a[k][p]=aux;
                }
            }
            for(p=j+1; p<=n+1; p++){
                a[i][p]/=a[i][j];
            }
            a[i][j]=1;
            for(k=i+1; k<=n; k++){
                if(!zero(a[k][j])){
                    for(p=j+1; p<=n+1; p++){
                        a[k][p]-=a[k][j]*a[i][p];
                    }
                    a[k][j]=0;
                }
            }
            i++;
            j++;
        }else{
            j++;
        }
    }
    for(i=n; i>0; i--){
        j=1;
        f=1;
        while((j<=n)&&(f)){
            if(!zero(a[i][j])){
                f=0;
                r[j]=a[i][n+1];
                for(p=j+1; p<=n; p++){
                    r[j]-=r[p]*a[i][p];
                }
            }else{
                j++;
            }
        }
    }
}
int main(){
    int m, x, y, z, i;
    FILE *fin, *fout;
    fin=fopen("tunel.in", "r");
    fout=fopen("tunel.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for(i=0; i<m; i++){
        fscanf(fin, "%d%d%d", &x, &y, &z);
        adauga(x, y, z);
        adauga(y, x, z);
    }
    a[n][n]=1;
    a[n][n+1]=0;
    gauss();
    fprintf(fout, "%.8lf\n", r[1]);
    fclose(fin);
    fclose(fout);
    return 0;
}