Pagini recente » Cod sursa (job #415194) | Cod sursa (job #688665) | Cod sursa (job #319457) | Cod sursa (job #2966562) | Cod sursa (job #2877541)
//exp_val[i] += (exp_val[j] + cost[j]) / gr[i].size()
#include <bits/stdc++.h>
using namespace std;
const int N = 260;
const double EPS = 1e-4;
struct Edge {
int to;
double cost;
};
vector<Edge> gr[N];
double mat[N][N];
bool isNull(double x) {
return x >= -EPS && x <= EPS;
}
void divide(double v[], double x, int n) {
for (int i = 1; i <= n + 1; ++i)
v[i] /= x;
}
void substract(double a[], double b[], double mult, int n) {
for (int i = 1; i <= n + 1; ++i)
a[i] -= b[i] * mult;
}
void gauss(int n) {
for (int i = 1; i <= n; ++i) {
for (int i2 = i; i2 <= n; ++i2)
if (!isNull(mat[i2][i])) {
swap(mat[i], mat[i2]);
break;
}
for (int i2 = i + 1; i2 <= n; ++i2)
substract(mat[i2], mat[i], mat[i2][i] / mat[i][i], n);
}
for (int i = n; i >= 1; --i)
for (int i2 = i - 1; i2 >= 1; --i2)
substract(mat[i2], mat[i], mat[i2][i] / mat[i][i], n);
}
int main() {
ifstream cin("tunel.in");
ofstream cout("tunel.out");
int n, m;
cin >> n >> m;
while (m--) {
int x, y, c;
cin >> x >> y >> c;
gr[x].push_back({y, c});
gr[y].push_back({x, c});
}
cin.close();
for (int i = 1; i <= n; ++i) {
mat[i][i] = 1;
if (i == n)
continue;
double tot = 0;
for (auto j: gr[i]) {
mat[i][j.to] += -1.0 / gr[i].size();
tot += j.cost;
}
mat[i][n + 1] = tot / gr[i].size();
}
gauss(n);
cout << fixed << setprecision(3) << mat[1][n + 1] / mat[1][1] << "\n";
cout.close();
return 0;
}