Cod sursa(job #579985)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 12 aprilie 2011 17:14:56
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#define Nmax 260
#define Mmax 100000
#define D double

int N,M;
D a[Nmax][Nmax],X[Nmax];
int grad[Nmax];

inline int swap_line(int i,int  j){
    int k; D aux;
    for(k=1;k<=N+1;++j) aux=a[i][k], a[i][k]=a[j][k], a[j][k]=aux;
}

int main(){
    int i,j,k,l,x,y,z; D sum;
    freopen("tunel.in","r",stdin);
    freopen("tunel.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(i=1;i<=M;++i){
        scanf("%d%d%d",&x,&y,&z);
        grad[x]++; grad[y]++;
        a[x][y]--; a[y][x]--;
        a[x][N+1] +=z; a[y][N+1] +=z;
    }
    for(i=1;i<=N;++i)
        a[i][i]=grad[i];

    for(i=1;i<N;++i){
        if( !a[i][i] ){
            for(l=i+1;l<N;++l)
                if(a[l][i]) break;
            if(l<=N) swap_line(i,l);
            else continue;
        }

        for(l=i+1;l<N;++l)
            for(k=i+1;k<=N+1;++k)
                a[l][k] -= a[l][i]*a[i][k]/a[i][i];

        for(k=i+1;k<N;++k) a[k][i]=0;

        for(k=i+1;k<=N+1;++k)
            a[i][k] /= a[i][i];
        a[i][i]=1;
    }

    X[N]=0;
    for(i=N-1;i>=1;--i){
        sum=0;
        for(j=i+1;j<=N;++j)
            sum+=a[i][j]*X[j];
        X[i]=a[i][N+1]-sum;
    }

    printf("%.4lf\n",X[1]);
    fclose(stdin); fclose(stdout);
    return 0;
}