Cod sursa(job #3137040)

Utilizator AlexandruBenescuAlexandru Benescu AlexandruBenescu Data 10 iunie 2023 18:24:04
Problema Flux Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>
#define L 105
#define EPS 0.0000000001
#define INF (1LL << 62)
using namespace std;
ifstream fin("flux.in");
ofstream fout("flux.out");

int n, edges;
vector <pair <int, double>> G[L];
double m[L][L];
bool vis[L];

int main(){
  fin >> n >> edges;
  for (int i = 1; i <= edges; i++){
    int a, b, c;
    fin >> a >> b >> c;
    assert(a == b);
    G[a].push_back({b, c});
    G[b].push_back({a, c});
  }

  m[1][1] = 1;
  for (int i = 2; i < n; i++){
    int neighbours = G[i].size();
    for (int j = 0; j < neighbours; j++)
      m[i][G[i][j].first]++;
    m[i][i] = -neighbours;
  }

  for (int j = 1; j <= n; j++){
    int rel = -1;
    for (int i = 1; i <= n; i++)
      if (abs(m[i][j]) > EPS && !vis[i]){
        rel = i;
        break;
      }
    if (rel == -1)
      continue;
    vis[rel] = true;
    double x = m[rel][j];
    for (int k = 1; k <= n + 1; k++)
      m[rel][k] /= x;
    for (int i = 1; i <= n; i++)
      if (i != rel){
        double coef = m[i][j];
        for (int k = 1; k <= n + 1; k++)
          m[i][k] -= coef * m[rel][k];
      }
  }

  double last_node = INF;
  for (int i = 1; i <= n; i++)
    for (auto it : G[i]){
      double cost_diff = abs(m[i][n] - m[it.first][n]);
      if (cost_diff < EPS)
        last_node = 0;
      else
        last_node = min(last_node, it.second / cost_diff);
    }

  double ans = 0;
  for (auto it : G[n])
    ans += last_node * (m[it.first][n] + 1);

  fout << ans << "\n";
  return 0;
}