Pagini recente » Cod sursa (job #661437) | Cod sursa (job #2358724) | Cod sursa (job #82151) | Cod sursa (job #2112518) | Cod sursa (job #1268337)
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
const int Nmax = 105;
const double Eps = 1e-10;
double __A[Nmax][Nmax], X[Nmax], *A[Nmax];
int Cap[Nmax][Nmax], G[Nmax][Nmax];
void Gauss(const int N) {
for (int i = 1, j = 0; i < N && j <= N; ) {
int k;
for (k = i; k < N && abs(A[k][j]) < Eps; ++k);
if (k == N) {
++j;
continue;
}
if (k != i) swap(A[k], A[i]);
for (int k = j + 1; k <= N; ++k)
A[i][k] /= A[i][j];
A[i][j] = 1;
for (int k = i + 1; k < N; ++k) {
for (int p = j + 1; p <= N; ++p)
A[k][p] -= A[i][p] * A[k][j];
A[k][j] = 0;
}
++i; ++j;
}
for (int i = N - 1; i > 0; --i) {
for (int j = 0; j < N; ++j) {
if (abs(A[i][j]) > Eps) {
X[j] = A[i][N];
for (int k = j + 1; k < N; ++k)
X[j] -= A[i][k] * X[k];
break;
}
}
}
}
int main()
{
freopen("flux.in", "r", stdin);
freopen("flux.out", "w", stdout);
int N, M;
scanf("%d%d", &N, &M);
for (int i = 0; i < N; ++i)
A[i] = __A[i];
while (M--) {
int x, y, cap;
scanf("%d%d%d", &x, &y, &cap);
x--; y--;
G[x][y]++;
G[y][x]++;
Cap[x][y] = Cap[y][x] = (G[x][y] == 1 ? cap: min(Cap[x][y], cap));
}
for (int i = 1; i < N; ++i) {
for (int j = 0; j < N; ++j) {
A[i][i] += G[i][j];
if (j != 0) A[i][j] -= G[i][j];
}
}
A[N - 1][N] = 1;
Gauss(N);
double minp = 1e30;
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
if (G[i][j])
minp = min(minp, (double) Cap[i][j] / abs(X[j] - X[i]));
double ans = 0;
for (int i = 0; i < N - 1; ++i)
ans += minp * (X[N - 1] - X[i]) * G[i][N - 1];
printf("%.10f\n", ans);
}