Pagini recente » Cod sursa (job #1056965) | Cod sursa (job #1181915) | Cod sursa (job #1334837) | Cod sursa (job #813619) | Cod sursa (job #717718)
Cod sursa(job #717718)
#include <fstream>
#include <vector>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int dim = 105;
const double e = 0.0000001;
int N, M, nviz;
double A[dim][dim], C[dim][dim], nr[dim][dim], X[dim], viz[dim];
int zero (double a)
{
if (-e < a && a < e)
return 1;
return 0;
}
double abso (double a)
{
if (a > 0)
return a;
return -a;
}
void cit ()
{
double c;
int x, y;
scanf ("%d %d", &N, &M);
N--;
for (int i = 1; i <= M; i++)
{
scanf ("%d %d %lf", &x, &y, &c);
x--, y--;
C[y][x] = C[x][y] = (C[x][y] == 0 ? c : min (c, C[x][y]));
nr[x][y] ++;
nr[y][x] ++;
}
}
void dfs (int n)
{
viz[n] = 1;
nviz++;
for (int f = 0; f <= N; f++)
if (nr[n][f] > 0 && viz[f] == 0)
dfs (f);
}
void prep ()
{
int i, j;
for (i = 1; i <= N; i++)
{
for (j = 0; j <= N; j++)
{
A[i][i] += nr[i][j];
if (j == 0)
continue;
A[i][j] -= nr[i][j];
}
}
A[N][N+1] = 1;
}
void gauss ()
{
int i, j, n, m;
for (i = 1; i <= N; i++)
viz[i] = 0;
for (i = j = 1; i <= N && j <= N; i++, j++)
{
for (n = i; n <= N && zero (A[n][j]); n++);
if (n > N)
{
i--;
continue;
}
if (n != i)
{
for (m = 1; m <= N+1; m++)
{
swap (A[i][m], A[n][m]);
}
}
for (n = i; n <= N; n++)
{
for (m = j + 1; m <= N+1; m++)
{
A[n][m] /= A[n][j];
}
A[n][j] = 1;
if (n != i)
{
for (m = j; m <= N+1; m++)
{
A[n][m] -= A[i][m];
}
}
}
}
for (i = N; i >= 1; i--)
{
m = 0;
for (j = 1; j <= N; j++)
{
if ( zero (A[i][j]) )
continue;
if (viz[j] == 1)
{
A[i][j] *= X[j];
}
else
{
if (m == 0)
{
m = j;
}
else
{
X[j] = 0;
A[i][j] = 0;
viz[j] = 1;
}
}
}
for (j = 1; j <= N; j++)
{
if (j != m)
{
A[i][N+1] -= A[i][j];
}
}
if (m == 0 && !zero (A[i][N+1]))
{
nviz = 0;
return;
}
if (m != 0)
{
X[m] = A[i][N+1] / A[i][m];
A[i][m] = 0;
viz[m] = 1;
}
}
}
void fin ()
{
int i, j;
double c, f, r = 0;
for (i = 0; i <= N; i++)
{
for (j = 0; j <= N; j++)
{
c = C[i][j];
f = abso (X[i] - X[j]) / nr[i][j];
if (r < c / f)
r = c / f;
}
}
printf ("%.6lf\n", r);
}
int main ()
{
freopen ("flux.in", "r", stdin);
freopen ("flux.out", "w", stdout);
cit ();
dfs (0);
if (nviz != N + 1)
{
printf ("0\n");
return 0;
}
prep ();
gauss ();
if (nviz != N + 1)
{
printf ("0\n");
return 0;
}
fin ();
return 0;
}