Cod sursa(job #2712743)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 26 februarie 2021 14:27:25
Problema Flux Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.99 kb
#include <bits/stdc++.h>
#define DIMN 110
#define EPS 0.0000000001
using namespace std;
vector <pair <int , int> > v[DIMN];
long double a[DIMN][DIMN] , x[DIMN];
void intersc (int i,int k,int m){
    int j;
    for (j=1;j<=m+1;j++)
        swap(a[i][j],a[k][j]);
}
int main()
{
    FILE *fin = fopen ("flux.in","r");
    ofstream fout ("flux.out");
    int n , m , i , j , xx , y , c , k , ii , jj , vecin;
    fscanf (fin,"%d%d",&n,&m);

    for (i = 1 ; i <= m ; i++){
        fscanf (fin,"%d%d%d",&xx,&y,&c);
        v[xx].push_back(make_pair(y , c));
        v[y].push_back(make_pair(xx , c));

        if (xx != 1 && xx != n){ /// variabila care ma intereseaza
            a[xx][xx]++; /// contribuie de grad
            a[xx][y]--; /// contribuie la nr de muchii
        }

        if (y != 1 && y != n){
            a[y][y]++; /// contribuie la grad
            a[y][xx]--; /// contribuie la nr de muchii
        }
    }

    /// x1 = 0
    a[1][1] = 1;
    a[n][n + 1] = 1;
    a[n][n] = 1; /// pe xn vreau sa il fac 1 (1 * maxim flux de pe viitor)

    i=j=1;
    while (i<=n && j<=n){
        for (k=i;k<=n;k++)
            if (a[k][j]!=0) // caut prm coef dif de 0
                break;
        if (k==n+1){ // toti coef sunt 0, e variabila libera
            j++;
            continue;
        }
        intersc (i,k,n); // interschimb liniile i si k
        for (k=j+1;k<=n+1;k++)
            a[i][k]/=a[i][j];
        a[i][j]=1;
        for (ii=i+1;ii<=n;ii++)
            for (jj=n+1;jj>=j;jj--)
                a[ii][jj]=a[ii][jj]-a[i][jj]*a[ii][j];
        i++;
        j++;
    }
    // aflarea solutiilor
    for (i=n;i>0;i--){
        for (j=1;j<=n+1;j++)
            if (a[i][j]>EPS || a[i][j]<-EPS)
                break;
        if (j==n+1){
            fout << "0.000"; // 0*x1 + 0*x2 +... 0*xn = y, y!=0 => imposibil
            return 0;
        }
        if (j==n+2) // e libera
            continue;
        x[j]=a[i][n+1]/a[i][j];
        for (k=i-1;k>0;k--)
            a[k][n+1]-=x[j]*a[k][j];
    }

    long double mini = 2000000000.0;

    for (i = 1 ; i <= n ; i++){

        for (j = 0 ; j < v[i].size() ; j++){
            vecin = v[i][j].first;
            c = v[i][j].second;

            if (x[vecin] != x[i]){

                if (x[vecin] > x[i] + EPS)
                    mini = min(mini , 1.0 * c / (x[vecin] - x[i]));
                else if (x[vecin] < x[i] - EPS)
                    mini = min(mini , 1.0 * c / (x[i] - x[vecin]));

            }

        }

    }

    i = n;
    long double sol = 0.0;
    for (j = 0 ; j < v[i].size() ; j++){
        vecin = v[i][j].first;
        c = v[i][j].second;

        if (x[vecin] != x[i]){

            if (x[vecin] > x[i] + EPS)
                sol += mini * (x[vecin] - x[i]);
            else if (x[vecin] < x[i] - EPS)
                sol += mini * (x[i] - x[vecin]);

        }


    }

    fout << setprecision(3) << fixed << sol;

    return 0;
}