Cod sursa(job #2419954)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 9 mai 2019 22:05:09
Problema Tunelul groazei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 255;
const double eps = 1e-8;

struct Edge {
  int u, c;
};

int gr[MAXN + 5];
vector<Edge>G[MAXN + 5];

double a[MAXN + 5][MAXN + 5];

double solve(int n) {
  int l = 1, p = 1;
  for (int i = 1; i < n && l < n; ++i) {
    int pos = l;
    for (int j = l + 1; j < n; ++j)
      if (fabs(a[j][i]) > fabs(a[pos][i]))
        pos = j;
    if (fabs(a[pos][i]) < eps)
      continue;
    for (int j = 1; j <= n; ++j)
      swap(a[l][j], a[pos][j]);
    double coef = 1. / a[l][i];
    for (int j = i; j <= n; ++j)
      a[l][j] *= coef;
    for (int j = 1; j < n; ++j)
      if (j != l) {
        coef = a[j][i];
        for (int t = 1; t <= n; ++t)
          a[j][t] -= coef * a[l][t];
      }
    if (i == 1)
      p = l;
    l++;
  }
  return a[p][n];
}

int main() {
  freopen("tunel.in", "r", stdin);
  freopen("tunel.out", "w", stdout);

  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) {
    int u, v, c;
    scanf("%d%d%d", &u, &v, &c);
    G[u].push_back({v, c});
    G[v].push_back({u, c});
    gr[u]++;
    gr[v]++;
  }

  for (int i = 1; i < n; ++i) {
    a[i][i] = gr[i];
    for (auto it:G[i]) {
      a[i][n] += it.c;
      if (it.u != n)
        a[i][it.u]--;
    }
  }

  printf("%.6f", solve(n));

  return 0;
}