Cod sursa(job #2192872)

Utilizator cella.florescuCella Florescu cella.florescu Data 7 aprilie 2018 16:18:45
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 255;
const double EPS = 2e-7;

vector < pair < int, int > > g[MAXN + 1];
double ans[MAXN + 1];

inline int is_null(double val) {
  return -EPS < val && val < EPS;
}

int main()
{
    int n, m;
    ifstream fin("tunel.in");
    fin >> n >> m;
    for (int i = 0; i < m; ++i) {
      int x, y, c;
      fin >> x >> y >> c;
      g[x].push_back({y, c});
      g[y].push_back({x, c});
    }
    fin.close();
    vector < vector < double > > eq(n + 1, vector < double > (n + 2));
    eq[n][n] = 1;
    for (int i = 1; i < n; ++i) {
      eq[i][i] = (int) g[i].size();
      for (auto it : g[i]) {
        eq[i][it.first] -= 1.0;
        eq[i][n + 1] += it.second;
      }
    }
    int i = 1, j = 1;
    while (i <= n && j <= n) {
      int k = i;
      while (k <= n && is_null(eq[k][j]))
        ++k;
      if (k <= n) {
        swap(eq[i], eq[k]);
        for (k = n + 1; k >= j; --k)
          eq[i][k] /= eq[i][j];
        for (int e = i + 1; e <= n; ++e)
          for (int v = n + 1; v >= j; --v)
            eq[e][v] -= eq[e][j] * eq[i][v];
        ++i;
      }
      ++j;
    }
    for (i = n; i > 0; --i) {
      j = 1;
      while (j <= n && is_null(eq[i][j]))
        ++j;
      if (j <= n) {
        ans[j] = eq[i][n + 1];
        for (int k = j + 1; k <= n; ++k)
          ans[j] -= ans[k] * eq[i][k];
      }
    }
    ofstream fout("tunel.out");
    fout << setprecision(4) << fixed << ans[1];
    fout.close();
    return 0;
}