Pagini recente » Cod sursa (job #310669) | Cod sursa (job #3266349) | Cod sursa (job #149977) | Cod sursa (job #768209) | Cod sursa (job #1491526)
#include<cstdio>
using namespace std;
int N, M, a[5009], b[5009], c[5009], ap[109][109], cnt[109], fixed[109], Ap[109], t[109];
double mini, G[109][109], X[109], eps;
double mod (double x)
{
if (x < 0.0) return -x;
return x;
}
int tata (int x)
{
if (x == t[x]) return x;
return t[x] = tata (t[x]);
}
void unite (int x, int y)
{
x = tata (x), y = tata (y);
if (x != y) t[x] = y;
}
int main ()
{
freopen ("flux.in", "r", stdin);
freopen ("flux.out", "w", stdout);
scanf ("%d %d", &N, &M), eps = 1e-11;
for (int i=1; i<=N; i++)
t[i] = i;
for (int i=1; i<=M; i++)
scanf ("%d %d %d", &a[i], &b[i], &c[i]), cnt[a[i]] ++, cnt[b[i]] ++, ap[a[i]][b[i]] ++, ap[b[i]][a[i]] ++, unite (a[i], b[i]);
if (t[1] != t[N])
{
printf ("0.000\n");
return 0;
}
for (int i=1; i<=N; i++)
{
if (i == 1) G[i][1] = 1.0, G[i][N + 1] = 0.0;
else
{
G[i][i] = cnt[i];
for (int j=1; j<=N; j++)
if (i != j) G[i][j] = (double)-ap[i][j];
G[i][N + 1] = 0.0;
if (i == N) G[i][N + 1] = 1.0;
}
}
for (int i=1; i<=N; i++)
if (tata (i) == tata (1))
{
int j;
for (j=1; j<=N; j++)
if (mod (G[i][j]) > eps && tata (j) == tata (1)) break;
if (j > N) continue;
fixed[i] = j, Ap[j] = 1;
for (int p=1; p<=N; p++)
if (p != i && mod (G[p][j]) > eps)
{
double r = (double) G[p][j] / G[i][j];
for (int k=1; k<=N + 1; k++)
G[p][k] = (double) G[p][k] - G[i][k] * r;
}
}
for (int i=1; i<=N; i++)
if (Ap[i] == 0 && tata (i) == tata (1))
{
printf ("0.000\n");
return 0;
}
for (int i=1; i<=N; i++)
X[fixed[i]] = (double) G[i][N + 1] / G[i][fixed[i]];
for (int i=1; i<=M; i++)
{
double C = X[b[i]] - X[a[i]];
if (((double) c[i] / C < mini || i == 1) && C > eps)
mini = (double) c[i] / C;
}
printf ("%.10lf\n", mini);
return 0;
}