Cod sursa(job #2877519)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 24 martie 2022 20:53:40
Problema Tunelul groazei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
//exp_val[i] += (exp_val[j] + cost[j]) / gr[i].size()
#include <bits/stdc++.h>

using namespace std;

const int N = 260;
const double EPS = 1e-3;

struct Edge {
  int to;
  double cost;
};

vector<Edge> gr[N];
double mat[N][N];

bool isNull(double x) {
  return x >= -EPS && x <= EPS;
}

void divide(double v[], double x, int n) {
  for (int i = 1; i <= n + 1; ++i)
    v[i] /= x;
}

void substract(double a[], double b[], double mult, int n) {
  for (int i = 1; i <= n + 1; ++i)
    a[i] -= b[i] * mult;
}

void gauss(int n) {
  for (int i = 1; i <= n; ++i) {
    for (int i2 = i; i2 <= n; ++i2)
      if (!isNull(mat[i2][i])) {
        swap(mat[i], mat[i2]);
        break;
      }
    divide(mat[i], mat[i][i], n);
    for (int i2 = i + 1; i2 <= n; ++i2)
      substract(mat[i2], mat[i], mat[i2][i], n);
  }
  for (int i = n; i >= 1; --i)
    for (int i2 = i - 1; i2 >= 1; --i2)
      substract(mat[i2], mat[i], mat[i2][i], n);
}

int main() {
  ifstream cin("tunel.in");
  ofstream cout("tunel.out");
  int n, m;
  cin >> n >> m;
  while (m--) {
    int x, y, c;
    cin >> x >> y >> c;
    gr[x].push_back({y, c});
    gr[y].push_back({x, c});
  }
  cin.close();
  for (int i = 1; i <= n; ++i) {
    mat[i][i] = 1;
    if (i == n)
      continue;
    double tot = 0;
    for (auto j: gr[i]) {
      mat[i][j.to] = -1.0 / gr[i].size();
      tot += j.cost;
    }
    mat[i][n + 1] = tot / gr[i].size();
  }
  gauss(n);
  cout << fixed << setprecision(3) << mat[1][n + 1] << "\n";
  cout.close();
  return 0;
}