Pagini recente » Cod sursa (job #1799680) | Cod sursa (job #1656633) | Cod sursa (job #1794433) | Cod sursa (job #1366643) | Cod sursa (job #1833736)
#include <bits/stdc++.h>
using namespace std;
typedef long double f80;
const int SPQR = 105; // Ave Imperator, morituri te salutant!
const f80 EPS = 1e-7L;
vector<pair<int, int>> g[SPQR];
valarray<f80> gs[SPQR];
int far[SPQR];
inline bool eq(const f80 &a, const f80 &b) {
return abs(a - b) < EPS; }
int getfar(int nod) {
if (!far[nod]) return nod;
else return (far[nod] = getfar(far[nod])); }
void join(int a, int b) {
if (getfar(a) != getfar(b))
far[getfar(a)] = b; }
int main(void) {
ifstream fi("flux.in");
ofstream fo("flux.out");
int n, m, u, v, c;
f80 rat, ant, aux;
rat = -1.0L;
ant = 0.0L;
fi >> n >> m;
for (int i = 0; i < m; ++i) {
fi >> u >> v >> c;
join(u, v);
g[u].emplace_back(v, c);
g[v].emplace_back(u, c); }
if (getfar(1) != getfar(n)) {
fo << "0.0\n";
return 0; }
for (int u = 1; u <= n; ++u)
gs[u].resize(n + 2);
gs[1][1] = gs[n][n] = gs[n][n + 1] = 1.0L;
for (int u = 2; u < n; ++u) {
gs[u][u] = g[u].size();
for (auto v: g[u])
gs[u][v.first]-= 1.0; }
for (int i = 1; i <= n; ++i) if (!eq(gs[i][i], 0.0L)) {
for (int j = 1; j <= n; ++j) if (i != j) {
gs[j]-= gs[i] * (gs[j][i] / gs[i][i]); } }
for (int i = 1; i <= n; ++i) if (!eq(gs[i][i], 0.0L)) {
aux = gs[i][i];
gs[i]/= aux; }
for (int u = 1; u <= n; ++u)
for (auto v: g[u])
rat = max(rat, abs(gs[v.first][n + 1] - gs[u][n + 1]) / v.second);
for (auto v: g[n])
ant+= (gs[n][n + 1] - gs[v.first][n + 1]) / rat;
cerr << rat << '\n';
fo << setprecision(3) << fixed << abs(ant) << '\n';
return 0; }
// :<