Cod sursa(job #2070626)

Utilizator robx12lnLinca Robert robx12ln Data 19 noiembrie 2017 19:23:53
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include<fstream>
#include<iomanip>
#include<vector>
using namespace std;
ifstream fin("tunel.in");
ofstream fout("tunel.out");
const double EPS = 1e-10;
int n, m, f[260], i, j;
double A[260][260], sol[260];
vector< pair<int,double> > v[260];
int main(){
    fin >> n >> m;
    for( int i = 1; i <= m; i++ ){
        int a, b; double c;
        fin >> a >> b >> c;
        v[a].push_back( make_pair( b, c ) );
        v[b].push_back( make_pair( a, c ) );
    }
    for( int i = 1; i < n; i++ ){
        A[i][i] = 1.0;
        int nr = v[i].size();
        for( int j = 0; j < v[i].size(); j++ ){
            int nod = v[i][j].first;
            double dist = v[i][j].second;
            A[i][nod] -= 1.0 / nr;
            A[i][n + 1] += 1.0 * dist / nr;
        }
    }
    A[n][n] = 1;
    i = j = 1;
    while( i <= n && j <= n ){
        bool ok = false;
        for( int ii = i; ii <= n; ii++ ){
            if( A[ii][j] < -EPS || A[ii][j] > EPS ){
                ok = true;
                if( ii != i )
                    for( int jj = 1; jj <= n + 1; jj++ )
                        swap( A[ii][jj], A[i][jj] );
                break;
            }
        }
        if( ok == false ){
            j++;
            continue;
        }
        for( int jj = j + 1; jj <= n + 1; jj++ )
            A[i][jj] /= A[i][j];
        A[i][j] = 1.0;
        for( int ii = i + 1; ii <= n; ii++ ){
            for( int jj = j + 1; jj <= n + 1; jj++ )
                A[ii][jj] -= A[ii][j] * A[i][jj];
            A[ii][j] = 0.0;
        }
        i++;
        j++;
    }
    for( int i = n; i >= 1; i-- ){
        int pos = 0;
        for( int j = 1; j <= n + 1; j++ ){
            if( A[i][j] < -EPS || A[i][j] > EPS ){
                pos = j;
                break;
            }
        }
        if( pos == 0 )
            continue;
        for( int j = pos + 1; j <= n; j++ )
            A[i][n + 1] -= A[i][j] * sol[j];
        sol[pos] = A[i][n + 1];
    }
    fout << setprecision(5) << fixed << sol[1] << "\n";
    return 0;
}