Cod sursa(job #2961649)

Utilizator AlexandruBenescuAlexandru Benescu AlexandruBenescu Data 6 ianuarie 2023 20:00:36
Problema Tunelul groazei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
#define L 260
#define EPS 0.00001
using namespace std;
ifstream fin("tunel.in");
ofstream fout("tunel.out");

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

bool cmp(const pair <int, int> &a, const pair <int, int> &b){
  return a.first < b.first;
}

int main(){
  int n, e;
  fin >> n >> e;
  for (int i = 0; i < e; i++){
    int a, b, c;
    fin >> a >> b >> c;
    G[a].push_back({b, c});
    G[b].push_back({a, c});
  }
  for (int i = 1; i < n; i++){
    int coef = G[i].size(), j = 0;
    for (auto it : G[i])
      v[j++] = it;
    sort(v, v + j, cmp);
    int l = 0;
    for (int k = 1; k <= n; k++){
      if (k == v[l].first){
        m[i][k] = (double)1 / coef;
        m[i][n + 1] = m[i][n + 1] - (double)1 / coef * v[l].second;
        l++;
      }
      else if (k == i){
        m[i][k] = -1;
      }
    }
  }
  m[n][n] = 1;

  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;
        i = n;
      }
    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];
      }
  }

  fout << setprecision(5) << m[1][n + 1] << "\n";
  return 0;
}