Pagini recente » Cod sursa (job #410780) | Cod sursa (job #2370266) | Cod sursa (job #689118) | Cod sursa (job #1673113) | Cod sursa (job #2119206)
#include <bits/stdc++.h>
#define eps 1e-8
#define inf 1e10
using namespace std;
int n, m;
vector<int> v[101];
int viz[101];
double cost[101][101];
double mat[101][101];
double fin[101][101];
double x[101];
void gauss()
{
int lc = 1, cc = 1;
while(lc < n && cc < n)
{
if(abs(mat[lc][cc]) < eps)
{
int k;
for(k = lc + 1; k < n && abs(mat[k][cc]) < eps; k++);
if(k == n)
{
cc++;
continue;
}
for(int i = cc; i <= n; i++)
swap(mat[lc][i], mat[k][i]);
}
for(int i = cc + 1; i <= n; i++)
mat[lc][i] /= mat[lc][cc];
mat[lc][cc] = 1;
for(int i = lc + 1; i < n; i++)
{
if(abs(mat[i][cc]) < eps) continue;
for(int j = cc + 1; j <= n; j++)
mat[i][j] -= mat[lc][j] * mat[i][cc];
mat[i][cc] = 0;
}
lc++; cc++;
}
for(int i = n - 1; i > 0; i--)
{
double sum = 0;
for(int j = i + 1; j < n; j++)
sum += x[j] * mat[i][j];
x[i] = mat[i][n] - sum;
}
}
void dfs(int nod)
{
if(viz[nod] == 1) return;
viz[nod] = 1;
for(int i = 0; i < v[nod].size(); i++)
{
fin[nod][v[nod][i]] = x[v[nod][i]] - x[nod];
dfs(v[nod][i]);
}
}
int main()
{
freopen("flux.in", "r", stdin);
freopen("flux.out", "w", stdout);
int a, b, c;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cost[i][j] = inf;
for(int i = 0; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
a--; b--;
if(cost[a][b] > c)
cost[a][b] = cost[b][a] = c;
mat[a][a]++;
mat[b][b]++;
mat[a][b]--;
mat[b][a]--;
v[a].push_back(b);
v[b].push_back(a);
}
mat[n - 1][n] = 1;
gauss();
dfs(0);
if(viz[n - 1] == 0)
printf("0.000");
else
{
double sol = inf;
for(int i = 0; i < n; i++)
for(int j = 0; j < v[i].size(); j++)
if(fin[i][v[i][j]] > 0)
sol = min(sol, cost[i][v[i][j]] / fin[i][v[i][j]]);
printf("%.3f", sol);
}
return 0;
}