Cod sursa(job #1825513)

Utilizator Tiberiu02Tiberiu Musat Tiberiu02 Data 9 decembrie 2016 12:05:42
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
# include <iostream>
# include <fstream>
# include <valarray>
# include <vector>

# define EPS 1e-7

using namespace std;
# define MAX_N 255

valarray<double> eq[MAX_N];
vector<int> v[MAX_N];
int s[MAX_N];

inline bool null( const double &t )
{
  return abs( t ) <= EPS;
}

int main()
{
    ifstream fin( "tunel.in" );
    ofstream fout( "tunel.out" );

    int n, m, i, j, k, a, b, l;

    fin >> n >> m;

    for ( i = 0; i < m; i ++ ) {
      fin >> a >> b >> l;

      a --;
      b --;

      v[a].push_back( b );
      v[b].push_back( a );

      s[a] += l;
      s[b] += l;
    }

    for ( i = 0; i < n - 1; i ++ ) {
      eq[i].resize( n + 1 );

      for ( int j : v[i] )
        eq[i][j] = 1.0 / v[i].size();
      eq[i][i] += -1;

      eq[i][n] = 1.0 * s[i] / v[i].size();
    }

    for ( i = j = 0; i < n - 1 && j < n; j ++ ) {
      if ( null( eq[i][j] ) ) {
        k = i + 1;
        while ( k < n - 1 && null( eq[k][j] ) )
          k ++;

        if ( k < n - 1 )
          swap( eq[i], eq[k] );
      }

      if ( !null( eq[i][j] ) ) {
        for ( k = 0; k < n - 1; k ++ )
          if ( k != i )
            eq[k] -= eq[i] * ( eq[k][j] / eq[i][j] );

        i ++;
      }
    }

    fout << -eq[0][n] / eq[0][0];

    fin.close();
    fout.close();

    return 0;
}