Pagini recente » Cod sursa (job #1777554) | Cod sursa (job #2767609) | Cod sursa (job #3249845) | Sedinta 2008-01-18 | Cod sursa (job #2958082)
#include <fstream>
#include <vector>
#include <valarray>
#include <iomanip>
using namespace std;
ifstream fin("tunel.in");
ofstream fout("tunel.out");
int const N = (1 << 8) + 3;
typedef valarray<double> vd;
int n , m;
vector<pair<int , int> > v[N];
valarray<vd> mat(vd(0.0 , N) , N);
void gauss(vd &r){
int i = 1 , j = 1;
while(i <= n && j <= n){
int k = i;
while(k <= n && abs(mat[k][j]) < 0.001){
++ k;
}
if(k == n + 1){
++ j;
continue;
}
swap(mat[i] , mat[k]);
mat[i] /= (double)mat[i][j];
for(k = i + 1 ; k <= n ; ++ k)
mat[k] -= (mat[i] * (double)mat[k][j]);
++ j , ++ i;
}
for(int i = n ; i ; -- i){
r[i] = mat[i][n + 1];
for(int j = i + 1 ; j <= n ; ++ j)
r[i] -= r[j] * mat[i][j];
}
}
int main()
{
fin >> n >> m;
for(int i = 1 ; i <= m ; ++ i){
int a , b , c;
fin >> a >> b >> c;
v[a].emplace_back(b , c);
v[b].emplace_back(a , c);
}
for(int i = 1 ; i <= n ; ++ i){
mat[i][i] = -1.0;
if(i == n)
continue;
int W(0) , nrv = v[i].size();
for(auto [y , w] : v[i]){
mat[i][y] += 1.0 / nrv;
W += w;
}
mat[i][n + 1] = -1.0 * W / nrv;
}
vd X(0.0 , n + 2);
gauss(X);
fout << fixed << setprecision(3) << X[1] << '\n';
return 0;
}