Pagini recente » Cod sursa (job #24926) | Cod sursa (job #340036) | Cod sursa (job #47759) | Cod sursa (job #2105108) | Cod sursa (job #2070626)
#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;
}