Cod sursa(job #741867)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 27 aprilie 2012 11:34:31
Problema Flux Scor 88
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <cassert>
#include <vector>

using namespace std;

struct Edge {
  int x, y, c;

  Edge(int _x, int _y, int _c) {
    x = _x; y = _y; c = _c;
  }
};

const int kMaxN = 105;

vector <Edge> v;

vector <int> L[kMaxN];

bool used[kMaxN];

int N;

double gauss[kMaxN][kMaxN], init[kMaxN];

void read() {
  int M, x, y, c;

  assert(scanf("%d%d", &N, &M));

  for (int i = 0; i < M; ++i) {
    assert(scanf("%d%d%d", &x, &y, &c));
    v.push_back(Edge(x, y, c));
    L[x].push_back(y);
    L[y].push_back(x);
  }
}

void df(int nod) {
  used[nod] = 1;

  for (int i = 0; i < (int)L[nod].size(); ++i)
    if (!used[L[nod][i]])
      df(L[nod][i]);
}

void initGauss() {
  for (int i = 0; i < (int)v.size(); ++i) {
    ++gauss[v[i].x][v[i].x]; --gauss[v[i].x][v[i].y];
    ++gauss[v[i].y][v[i].y]; --gauss[v[i].y][v[i].x];
  }

  for (int i = 0; i <= N; ++i)
    gauss[1][i] = 0;

  gauss[1][1] = 1;
  gauss[N][0] = 1;
}

void _Gauss() {
  for (int j = 1; j <= N; ++j) {
    int i = 0;

    for (i = j; i <= N; ++i)
      if (gauss[i][j])
        break;

    if (i != j)
      swap(gauss[i], gauss[j]);
  
    for (i = 1; i <= N; ++i) 
      if (i != j) {
        double x = - gauss[i][j] / gauss[j][j];

        for (int k = 0; k <= N; ++k)
          gauss[i][k] += x * gauss[j][k];
      }
  }

  for (int i = 1; i <= N; ++i)
    init[i] = gauss[i][0] / gauss[i][i];
}

inline double modul(double x) {
  return x < 0 ? (-x) : x;
}

void solve() {
  double coef = (1LL << 60);

  for (int i = 0; i < (int)v.size(); ++i) {
    double cc = v[i].c / modul(init[v[i].x] - init[v[i].y]);
    
    if (cc < coef)
      coef = cc;
  }

  printf("%lf\n", coef);
}

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

  read();

  df(1);

  if (used[N]) {
    initGauss();
    _Gauss();

    solve();
    return 0;
  }

  printf("%lf\n", 0);

  return 0;
}