Problem p01289 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;

typedef vector<double> vec;
typedef vector<vec> mat;
const double EPS = 1E-8;

vec gauss_jordan(const mat &A, const vec &b) {
  int n = A.size();
  mat B(n, vec(n + 1));
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      B[i][j] = A[i][j]; // n*(n+1)の配列にする。

  for (int i = 0; i < n; i++)
    B[i][n] = b[i]; // n番目に代入

  for (int i = 0; i < n; i++) {
    int pivot = i; // 次の基準となる添え字。
    for (int j = i; j < n; j++)
      if (abs(B[j][i]) > abs(B[pivot][i]))
        pivot = j;        // 0以外の1つを探す
    swap(B[i], B[pivot]); // i行目に持ってくる。

    if (abs(B[i][i]) < EPS)
      return vec(); // もしも０だったら解なしまたは複数存在。

    for (int j = i + 1; j <= n; j++)
      B[i][j] /= B[i][i]; // 左辺をB[i][i]で両辺を割る。

    for (int j = 0; j < n; j++) { //
      if (i != j)                 // i行目-i行目はスキップ
        for (int k = i + 1; k <= n; k++)
          B[j][k] -= B[j][i] * B[i][k]; // i列の値をi列目以外を0にする。
    }
  }
  vec x(n);
  for (int i = 0; i < n; i++)
    x[i] = B[i][n];
  return x;
}

int main() {
  int n, s, t, q[100], a[100][100], d[100][100];
  while (cin >> n >> s >> t, n) {
    vector<int> v[2][100];
    s--, t--;
    for (int i = 0; i < n; i++)
      cin >> q[i];
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) {
        cin >> a[i][j];
        if (!a[i][j])
          a[i][j] = d[i][j] = 1e9;
        else
          v[0][i].push_back(j), d[i][j] = a[i][j];
      }
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        for (int k = 0; k < n; k++)
          d[j][k] = min(d[j][k], d[j][i] + d[i][k]);
    if (d[s][t] == 1e9) {
      cout << "impossible" << endl;
      return 0;
    }
    mat A(n, vec(n));
    vec b(n);
    for (int i = 0; i < n; i++) {
      if (d[i][t] == a[i][t])
        v[1][i].push_back(t);
      for (int j = 0; j < n; j++)
        if (d[i][t] == a[i][j] + d[j][t])
          v[1][i].push_back(j);
    }
    for (int i = 0; i < n; i++) {
      int sz = v[q[i]][i].size();
      if (i == t) {
        A[i][i] = 1;
        continue;
      }
      double cnt = 0;
      for (int j = 0; j < sz; j++) {
        int p = v[q[i]][i][j];
        A[i][p] = 1.0 / sz;
        cnt += a[i][p];
      }
      A[i][i] -= 1;
      b[i] -= cnt / sz;
    }
    vec res = gauss_jordan(A, b);
    printf("%.9lf\\n", res[s]);
  }
  return 0;
}


Error: WA

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

typedef vector<double> vec;
typedef vector<vec> mat;
const double EPS = 1E-8;

vec gauss_jordan(const mat &A, const vec &b) {
  int n = A.size();
  mat B(n, vec(n + 1));
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      B[i][j] = A[i][j]; // n*(n+1)の配列にする。

  for (int i = 0; i < n; i++)
    B[i][n] = b[i]; // n番目に代入

  for (int i = 0; i < n; i++) {
    int pivot = i; // 次の基準となる添え字。
    for (int j = i; j < n; j++)
      if (abs(B[j][i]) > abs(B[pivot][i]))
        pivot = j;        // 0以外の1つを探す
    swap(B[i], B[pivot]); // i行目に持ってくる。

    if (abs(B[i][i]) < EPS)
      return vec(); // もしも０だったら解なしまたは複数存在。

    for (int j = i + 1; j <= n; j++)
      B[i][j] /= B[i][i]; // 左辺をB[i][i]で両辺を割る。

    for (int j = 0; j < n; j++) { //
      if (i != j)                 // i行目-i行目はスキップ
        for (int k = i + 1; k <= n; k++)
          B[j][k] -= B[j][i] * B[i][k]; // i列の値をi列目以外を0にする。
    }
  }
  vec x(n);
  for (int i = 0; i < n; i++)
    x[i] = B[i][n];
  return x;
}

int main() {
  int n, s, t, q[100], a[100][100], d[100][100];
  vec v[2][100];
  while (cin >> n >> s >> t, n) {
    s--, t--;
    for (int i = 0; i < n; i++)
      cin >> q[i];
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) {
        cin >> a[i][j];
        if (!a[i][j])
          a[i][j] = d[i][j] = 1e9;
        else
          v[0][i].push_back(j), d[i][j] = a[i][j];
      }
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        for (int k = 0; k < n; k++)
          d[j][k] = min(d[j][k], d[j][i] + d[i][k]);
    if (d[s][t] == 1e9) {
      cout << "impossible" << endl;
      return 0;
    }
    mat A(n, vec(n));
    vec b(n);
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        if (d[i][t] == a[i][j] + d[j][t])
          v[1][i].push_back(j);
    for (int i = 0; i < n; i++) {
      if (i == t) {
        A[i][i] = 1;
        continue;
      }
      int sz = v[q[i]][i].size();
      double cnt = 0;
      for (int j = 0; j < sz; j++) {
        int p = v[q[i]][i][j];
        A[i][p] = 1.0 / sz;
        cnt += 1.0 * a[i][p] / sz;
      }
      A[i][i] -= 1;
      b[i] = -cnt;
    }
    vec res = gauss_jordan(A, b);
    double ans = 0;
    if (res.size() != 0)
      ans = res[s];
    printf("%.9lf\\n", ans);
  }
  return 0;
}