Pagini recente » Cod sursa (job #936405) | Cod sursa (job #2177906) | Cod sursa (job #1054109) | Cod sursa (job #1918495) | Cod sursa (job #1065887)
#include <stdio.h>
#include <assert.h>
bool adj[111][111];
int cmin[111][111];
double res[111], M[111][111];
const int EPS = 0.00000001;
void add(int xx, int yy, int cc) {
adj[xx][yy] = 1;
if (cc < cmin[xx][yy])
cmin[xx][yy] = cc;
if (xx != 1) {
++M[xx][xx];
--M[xx][yy];
}
}
void swap(double &A, double &B) {
double tmp = A;
A = B;
B = tmp;
}
double abs(double X) {
return X > 0 ? X : -X;
}
bool mlc;
void eliminareGaozara(int N, int m) {
int i = 1, j = 1, k;
while (i <= N && j <= m) {
for (k = i; k <= N; ++k)
if (!(abs(M[k][j]) <= EPS))
break;
if (k == N + 1) {
++j;
continue;
}
for (int c = 1; c <= m + 1; ++c)
swap(M[i][c], M[k][c]);
double ret = M[i][j];
for (k = 1; k <= m + 1; ++k)
M[i][k] /= ret;
for (k = i + 1; k <= N; ++k) {
ret = M[k][j];
for (int c = 1; c <= m + 1; ++c)
M[k][c] = M[k][c] - ret * M[i][c];
}
++i; ++j;
}
for (i = N; i >= 1; --i) {
for (j = 1; j <= m + 1; ++j)
if (!(abs(M[i][j]) <= EPS))
break;
if (j <= m) {
res[i] = M[i][m + 1];
for (int k = m; k > j; --k)
res[i] -= res[k] * M[i][k];
} else
if (M[i][m + 1] > EPS) {
printf("0.000");
mlc = 1;
}
}
}
int main() {
freopen("flux.in", "r", stdin);
freopen("flux.out", "w", stdout);
int N, m;
scanf("%d%d", &N, &m);
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
cmin[i][j] = 1000000000.0;
for (int i = 1; i <= m; ++i) {
int xx, yy, cc;
scanf("%d%d%d", &xx, &yy, &cc);
add(xx, yy, cc);
add(yy, xx, cc);
}
M[1][1] = 1;
M[N][N + 1] = 1;
eliminareGaozara(N, N);
double scalar = 1000000000.0;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
if (adj[i][j] && res[j] - res[i] > EPS)
if (scalar - (double)cmin[i][j] / (res[j] - res[i]) > EPS)
scalar = (double)cmin[i][j] / (res[j] - res[i]);
double sol = 0;
for (int i = 1; i <= N; ++i)
if (adj[i][N])
sol += (res[N] - res[i]) * scalar;
if (!mlc)
printf("%.3lf", sol);
return 0;
}