Cod sursa(job #1583671)

Utilizator hrazvanHarsan Razvan hrazvan Data 29 ianuarie 2016 10:37:59
Problema Tunelul groazei Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <stdio.h>
#define MAXN 255
#define MAXM 100000
#define EPS 0.0000001
double nr[MAXN], a[MAXN][MAXN + 1];
int ult[MAXN], nod[2 * MAXM], next[2 * MAXM], timp[2 * MAXM];

inline int cmp(double a, double b){
  if(a - b > EPS)
    return 1;
  if(b - a > EPS)
    return -1;
  return 0;
}

inline void gauss(int n){
  int i, j, k, l;
  double aux;
  for(i = 0, j = 0; i < n - 1; i++, j++){
    k = i;
    while(k < n - 1 && cmp(a[k][j], 0) == 0)
      k++;
    if(k <  n - 1){
      for(l = 0; l <= n; l++){
        aux = a[i][l];  a[i][l] = a[k][l];  a[k][l] = aux;
      }
      for(k = j + 1; k <= n; k++)
        a[i][k] /= a[i][j];
      a[i][j] = 1;
      for(k = i + 1; k < n - 1; k++){
        for(l = j + 1; l <= n; l++){
          a[k][l] -= a[i][l] * a[k][j];
        }
      }
    }
  }
  for(i = n - 2; i >= 0; i--){
    for(j = n; j > i; j--){
      a[i][n] -= nr[j] * a[i][j];
    }
    nr[i] = a[i][n] / a[i][j];
  }
}

int main(){
  FILE *in = fopen("tunel.in", "r");
  int n, m, i, x, y, z, d = 0;
  fscanf(in, "%d%d", &n, &m);
  memset(ult, -1, sizeof ult);
  for(i = 0; i < m; i++){
    fscanf(in, "%d%d%d", &x, &y, &z);
    x--;  y--;
    nod[d] = x;
    next[d] = ult[y];
    timp[d] = z;
    ult[y] = d;
    d++;
    nod[d] = y;
    next[d] = ult[x];
    timp[d] = z;
    ult[x] = d;
    d++;
  }
  fclose(in);
  int poz, k;
  for(i = 0; i < n - 1; i++){
    poz = ult[i];
    k = 0;
    while(poz != -1){
      a[i][nod[poz]]++;
      a[i][n] -= timp[poz];
      k++;
      poz = next[poz];
    }
    a[i][i] = -k;
  }
  gauss(n);
  FILE *out = fopen("tunel.out", "w");
  fprintf(out, "%lf", nr[0]);
  fclose(out);
  return 0;
}