Cod sursa(job #1403150)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 27 martie 2015 04:58:53
Problema Flux Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include<cstdio>
#define eps 0.00000001
#define INF 2000000000
int n,m,i,j,a,b,ab,k,l,aux,v[200],d[110][110];
double ss,c[110][110],x[110][110],y[110][110],s[200];
FILE *f,*g;
void dfs(int nod){
    v[nod]=1;
    for(int i=1;i<=n;i++){
        if(!v[i]&&d[nod][i]){
            y[nod][i]=s[i]-s[nod];
            y[i][nod]=-y[nod][i];
            dfs(i);
        }
        else{
            if(d[nod][i]){
                y[nod][i]=s[i]-s[nod];
                y[i][nod]=-y[nod][i];
            }
        }
    }
}
int main(){
    f=fopen("flux.in","r");
    g=fopen("flux.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            c[i][j]=INF;
        }
    }
    for(i=1;i<=n;i++){
        fscanf(f,"%d%d%d",&a,&b,&ab);
        if(c[a][b]>ab)
            c[a][b]=ab;
        c[b][a]=c[a][b];
        d[a][b]++;
        d[b][a]++;
    }
    for(i=2;i<=n;i++){
        for(j=1;j<=n;j++){
            if(i!=j){
                x[i][j]=d[i][j];
                x[i][i]-=d[i][j];
            }
        }
    }
    x[n][n+1]=1;
    i=j=2;
    while(i<=n){
        for(k=i;k<=n;k++){
            if(x[k][j]>eps||x[k][j]<-eps)
                break;
        }
        if(k==n+1){
            j++;
            continue;
        }
        if(k!=i){
            for(l=j;l<=n+1;l++){
                aux=x[i][l];
                x[i][l]=x[k][l];
                x[k][l]=aux;
            }
        }
        for(l=j+1;l<=n+1;l++){
            x[i][l]/=x[i][j];
        }
        x[i][j]=1;
        for(k=i+1;k<=n;k++){
            for(l=j+1;l<=n+1;l++){
                x[k][l]-=(x[i][l]*x[k][j]);
            }
            x[k][j]=0;
        }
        i++;
        j++;
    }
    for(i=n;i>=2;i--){
        for(j=2;j<=n+1;j++){
            if(x[i][j]>eps||x[i][j]<-eps)
                break;
        }
        s[j]=x[i][n+1];
        for(l=j+1;l<=n;l++){
            s[j]-=x[i][l]*s[l];
        }
    }
    dfs(1);
    if(!v[n]){
        fprintf(g,"0.0000");
        return 0;
    }
    ss=INF;
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            if( d[i][j] && y[i][j]>0 )
                if(ss>c[i][j]/y[i][j])
                    ss=c[i][j]/y[i][j];
        }
    }
    fprintf(g,"%.3lf",ss);
    fclose(f);
    fclose(g);
    return 0;
}