Cod sursa(job #1794102)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 31 octombrie 2016 22:11:50
Problema Flux Scor 92
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <iomanip>
using namespace std;

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

const int DIM = 1e2 + 5;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-5;

vector< pair<int, int> > g[DIM];
double sys[DIM][DIM], sol[DIM];

int main( int argc, const char *argv[] ) {
    ios::sync_with_stdio( false );

    int n, m; in >> n >> m;
    for( int i = 1; i <= m; i ++ ) {
        int x, y, z; in >> x >> y >> z;
        g[x].push_back( make_pair(y, z) );
        g[y].push_back( make_pair(x, z) ); }

    for( int x = 2; x < n; x ++ ) {
        for( auto y : g[x] ) {
            sys[x][x] ++; sys[x][y.first] --; } }
    sys[1][1] = sys[n][n] = sys[n][n + 1] = 1;

    for( int i = 1, j = 1, ok = 0; i <= n && j <= n; ok = 0 ) {
        for( int k = i; k <= n; k ++ ) {
            if( fabs( sys[k][j] ) > EPS ) {
                swap_ranges( sys[i], sys[i] + n + 2, sys[k] ); ok = 1; break; } }
        if( ok == 0 ) {
            j ++; }
        else {
            for( int k = n + 1; k >= j; k -- ) {
                sys[i][k] /= sys[i][j]; }
            for( int k = i + 1; k <= n; k ++ ) {
                for( int p = n + 1; p >= j; p -- ) {
                    sys[k][p] -= sys[k][j] * sys[i][p]; } }
            i ++; j ++; } }

    for( int i = n, j = 1; i >= 1; i --, j = 1 ) {
        while( fabs( sys[i][j] ) < EPS ) {
            j ++; }
        sol[j] = sys[i][n + 1];
        for( int k = j + 1; k <= n; k ++ ) {
            sol[j] -= sol[k] * sys[i][k]; } }

    double aux = 0;
    for( int x = 1; x <= n; x ++ ) {
        for( auto y : g[x] ) {
            aux = max( aux, (sol[y.first] - sol[x]) / y.second ); } }
    double ans = 0;
    for( auto y : g[n] ) {
        ans += (sol[n] - sol[y.first]) / aux; }

    out << setprecision(3) << fixed << ans << endl;
    return 0; }