Cod sursa(job #1232817)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 23 septembrie 2014 22:46:55
Problema Flux Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>
#include <iomanip>

using namespace std;

ifstream fin ("flux.in");
ofstream fout ("flux.out");

double a[110][110],x[110],sol,aux;

int c[110][110],d[110][110];

bool f[110],ok;

int n,m,X,Y,C,k,l,i,j;

double modul (double x) {
    return (x>0?x:-x);
}

void dfs (int nod) {
    f[nod]=1;
    for (int i=1;i<=n&&!ok;i++)
        if (d[nod][i]!=0 && f[i]==0) {
            if (i==n) {
                ok=1;
                return;
            }dfs(i);
        }
}

int main () {

    fin>>n>>m;
    for (i=1;i<=m;i++) {
        fin>>X>>Y>>C;
        if (d[X][Y]!=0)
            c[X][Y]=c[Y][X]=min(C,c[X][Y]);
        else
            c[X][Y]=c[Y][X]=C;
        d[X][Y]++;
        d[Y][X]++;
        sol+=C;
    }
    for (i=2;i<=n;i++)
        for (j=1;j<=n;j++) {
            a[i][j]-=d[i][j];
            a[i][i]+=d[i][j];
        }
    a[n][n+1]=1;
    i=1;j=1;
    while (i<=n && j<=n){
        for (k=i;k<=n;k++)
            if (modul(a[k][j])>=0.00000001)
                break;
        if (k==n+1) {
            j++;
            continue;
        }
        if (k!=i)
            for (l=j;l<=n+1;l++){
                aux=a[k][l];
                a[k][l]=a[i][l];
                a[i][l]=aux;
            }
        for (l=j+1;l<=n+1;l++)
            a[i][l]/=a[i][j];
        a[i][j]=1;
        for (k=i+1;k<=n;k++){
            for(l =j+1;l<=n+1;l++)
                a[k][l]-=a[k][j]*a[i][l];
            a[k][j]=0;
        }
        i++;j++;
    }
    for (i=n;i>=1;i--) {
        for (j=1;j<=n+1;j++)
            if (modul(a[i][j])>0.0000001)
                break;
        if (j>n+1)
            continue;
        x[j]=a[i][n+1];
        for (k=j+1;k<=n;k++)
            x[j]-=a[i][k]*x[k];
    }
    dfs(1);
    if (!ok) {
        fout<<"0\n";
        return 0;
    }

    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
            if (d[i][j]!=0) {
                if (modul (x[j]-x[i])>0.0000001)
                    sol=min(sol,c[i][j]/modul (x[j]-x[i]));
            }
    fout<<setprecision (3)<<fixed;
    fout<<sol<<"\n";

    return 0;
}