Pagini recente » Cod sursa (job #252603) | Cod sursa (job #2222859) | Monitorul de evaluare | Cod sursa (job #1198786) | Cod sursa (job #1795247)
#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
#define NMAX 103
#define eps 1e-7
using namespace std;
int n, m;
double a[NMAX][NMAX], sol[NMAX];
bool zero (double x)
{
if (x >-eps && x < eps)
return 0;
return 1;
}
int viz[NMAX];
vector <int> v[NMAX], co[NMAX];
void dfs(int k)
{
viz[k] = 1;
for (int i = 0; i < v[k].size(); i++)
if (viz[v[k][i]] == 0)
dfs(v[k][i]);
}
int main ()
{
int x, y, cost;
ifstream cin ("flux.in");
ofstream cout ("flux.out");
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
cin >> x >> y >> cost;
v[x].push_back(y);
v[y].push_back(x);
co[x].push_back (cost);
co[y].push_back (cost);
}
dfs (1);
if (viz[n] == 0)
{
cout << "0.000";
return 0;
}
for (int i = 2; i < n; i++)
{
a[i][i] = v[i].size();
for (int j = 0; j < v[i].size(); j++)
a[i][v[i][j]] -= 1.0;
}
a[1][1] = a[n][n] = a[n][n + 1] = 1.0;
int l = 1, c = 1;
while (l <= n && c <= n)
{
if (zero (a[l][c]) == 0)
{
for (int i = l + 1; i <= n; i++)
if (zero(a[i][c]))
{
swap (a[i],a[l]);
break;
}
}
if (zero(a[l][c]) == 0)
{
c++;
continue;
}
for (int i = 1; i <= n; i++)
{
if (i == l)
continue;
double k = 1.0 * a[i][c] / a[l][c];
for (int j = 1; j <= n + 1; j++)
a[i][j] -= 1.0 * k * a[l][j];
}
l++;
c++;
}
for (int i = 1; i <= n; i++)
sol[i] = a[i][n + 1]* 1.0 / a[i][i];
double kp = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 0 ;j < v[i].size(); j++)
{
kp = max (kp, (sol[v[i][j]] - sol[i])* 1.0 / co[i][j]);
}
}
double s = 0;
for (int j = 0; j < v[n].size(); j++)
s += 1.0 * (sol[n] - sol[v[n][j]])/kp;
// cout << kp;
cout << setprecision(4) << fixed;
cout << s;
return 0;
}