Cod sursa(job #1237942)

Utilizator PaueyPaula Nicoleta Gradu Pauey Data 5 octombrie 2014 11:35:17
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <iostream>
#include <cmath>
#include <algorithm>
#include <fstream>
#include <iomanip>
#include <vector>
#define NMAX 260
#define EPS 1.e-5
using namespace std;

struct node {
   int st;
   double cost;
};

vector<node> G[NMAX];
int N;
double val[NMAX][NMAX];
double ans[NMAX];

inline void sl(int x, int y) {
    for(int i = 1; i <= N + 1; ++i) {
        swap(val[x][i], val[y][i]);
    }
}

int main()
{
    ifstream cin("tunel.in");
    ofstream cout("tunel.out");
    int N, M, x, y;
    double c;
    cin >> N >> M;
    for(int i = 1; i <= M; ++i) {
      cin >> x >> y >> c;
      node n1, n2;
      n1.st = x, n2.st = y;
      n1.cost = n2.cost = c;
      G[x].push_back(n2);
      G[y].push_back(n1);
    }
    for(int i = 1; i < N; ++i) {
      for(int j = 1; j <= N; ++j) {
         val[i][j] = 0;
      }
      val[i][i] = -1;
      double imp = 1.0 / G[i].size();
      for(int k = 0; k < G[i].size(); ++k) {
         val[i][G[i][k].st] += imp;
         val[i][N + 1] -= imp * G[i][k].cost;
      }
    }
    val[N][N] = 1;
    int cur = 1;
    for(int i = 1; i <= N; ++i) {
      if(fabs(val[cur][i]) < EPS) {
         for(int j = cur + 1; j <= N; ++j){
            if(fabs(val[j][i]) >= EPS) {
               sl(cur, j);
               break;
            }
         }
      }
      for(int j = 1; j <= N; ++j) {
         if(j != cur){
            double inm = val[j][i] / val[i][i];
            for(int k = 1; k <= N + 1; ++k) {
               val[j][k] -= val[i][k] * inm;
            }
         }
      }
      ++cur;
    }
    cur = 1;
    for(int i = 1; i <= N; ++ i) {
        if(val[cur][i]) {
            ans[i] = val[cur][N + 1] / val[cur][i];
            ++cur;
        }
    }
    cout << fixed << setprecision(4) << ans[1];
    return 0;
}