Pagini recente » Cod sursa (job #1017736) | Cod sursa (job #128150) | Cod sursa (job #2144585) | Cod sursa (job #1606629) | Cod sursa (job #1552767)
#include <cstdio>
using namespace std;
const int NMAX = 300;
const double EPS = 1e-4;
double M[NMAX][NMAX];
int n, m;
int main() {
freopen("tunel.in", "r", stdin);
freopen("tunel.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 0, x, y, c; i < m; i++) {
scanf("%d %d %d", &x, &y, &c);
M[x][y]++; M[x][n+1] -= c;
M[y][x]++; M[y][n+1] -= c;
}
for (int i = 1; i <= n; i++) {
int deg = 0;
for (int j = 1; j <= n; j++) {
deg += M[i][j] > 0;
}
for (int j = 1; j <= n+1; j++) {
M[i][j] /= 1. * deg;
}
M[i][i] = -1;
}
for (int i = 1; i <= n+1; i++) {
M[i][n] = 0;
M[n][i] = 0;
}
int x, y;
x = 1;
y = 1;
while (x < n && y <= n) {
int i, j;
for (i = x; i <= n && (M[i][y] >= -EPS && M[i][y] <= EPS); i++);
if (i == n+1) {
y++;
continue;
}
for (j = 1; j <= n + 1; j++) {
double aux = M[x][j];
M[x][j] = M[i][j];
M[i][j] = aux;
}
for (i = 1; i <= n; i++) {
if (i == x)
continue;
double p = M[i][y] / M[x][y];
for (j = y; j <= n + 1; j++) {
M[i][j] -= p * M[x][j];
}
}
x++;
y++;
}
double ans = M[1][n + 1] / M[1][1];
printf("%.3lf\n", ans);
return 0;
}