#include #include #include #include #include #include using namespace std; #define E 0.0000000001 #define EE 0.00000001 void bf( int N, const vector< vector< pair > > > &e, double ce, double ct, int src, vector< double > &d, vector &prev, vector &prev_nth ) { d.resize( N ); prev.resize( N ); prev_nth.resize( N ); for( int i = 0; i < N; i ++ ){ d[i] = DBL_MAX; prev[i] = -1; prev_nth[i] = -1; } d[src] = 0; for( int k = 1; k < N; k ++ ){ int flag = 0; for( int i = 0; i < N; i ++ ){ for( int j = 0; j < e[i].size(); j ++ ){ int J = e[i][j].first; if( J < 0 ) continue; double D = d[i] + e[i][j].second.first * ce + e[i][j].second.second * ct; if( d[J] - E > D ){ d[J] = D; prev[J] = i; prev_nth[J] = j; flag = 1; } } } if( !flag ) break; } } int main( void ) { FILE *in = fopen( "rakunarok.in", "r" ); if( in == NULL ) return 0; int TT; fscanf( in,"%d", &TT ); for( int C = 0; C < TT; C ++ ){ int n, m; fscanf( in, "%d%d", &n, &m ); int s, t; fscanf( in, "%d%d", &s, &t ); vector< vector< pair > > > e( n ); double T = 0, Etotal = 0; for( int i = 0; i < m; i ++ ){ int a, b, ee, t; fscanf( in, "%d%d%d%d", &a, &b, &ee, &t ); e[a].push_back( pair >(b, pair(ee,t) ) ); e[b].push_back( pair >(a, pair(ee,t) ) ); T += t; Etotal += ee; } vector dt( n ), de( n ), dr( n ); vector prev, prev_nth; bf( n, e, 0, 1, t, dt, prev, prev_nth ); bf( n, e, 1, 0, t, de, prev, prev_nth ); // printf( "a\n" ); double vm = de[s] / T; double vM = Etotal / dt[s]; vM = max(vM, vm + EE * 2); for( int i = 0; i < n; i ++ ){ for( int j = 0; j < e[i].size(); j ++ ){ int J = e[i][j].first; if( dt[i] <= dt[J] ){ e[i][j].first = -1; } } } while( vm + EE < vM ){ // printf( "%.20lf - %.20lf\n", vm, vM ); double r = (vm + vM) * 0.5; bf( n, e, -1, r, s, dr, prev, prev_nth ); if( dr[t] > 0 ) vM = r; else vm = r; } bf( n, e, -1, (vm + vM) * 0.5, s, dr, prev, prev_nth ); double re = 0, rt = 0; for( int i = t; i >= 0 && prev[i] >= 0; i = prev[i] ){ // printf( "%d %d %d\n", i, prev[i], prev_nth[i] ); re += e[prev[i]][prev_nth[i]].second.first; rt += e[prev[i]][prev_nth[i]].second.second; } printf( "%.4lf\n", re / rt ); } fclose( in ); return 0; }