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

#include <algorithm>
#include <iostream>
using namespace std;

#define inf 100000000

int N, M;
int disL[200][200]; // 隣接行列の重みバージョン陸
int disS[200][200]; // 海
int r;
int z[1000];
int disP[1000][200] = {};

/*町番号は0からN-1とする（入力は1からN）*/

/*町Z(num)からZr（終点）への最短時間（船が町shipにある状況で）を返す
z  宅配順列の何番目か0->(r-1)
ship 船のある町番号0->N-1
*/
int recur(int num, int ship) {
  int land, sea = inf, i;
  if (disP[num][ship] != 0)
    return disP[num][ship];
  if (num >= r - 1)
    return 0; // ゴール
  land = disL[z[num]][z[num + 1]] + recur(num + 1, ship);

  for (i = 0; i < N; i++) {
    sea = min(sea, disL[z[num]][ship] + disS[ship][i] + disL[i][z[num + 1]] +
                       recur(num + 1, i));
  }

  disP[num][ship] = min(land, sea);
  return disP[num][ship];
}

int main() {
  int i, j, k, x, y, t;
  char ch;
  while (true) {

    for (i = 0; i < 1000; i++)
      for (j = 0; j < 200; j++)
        disP[i][j] = 0;

    /*入力処理*/
    cin >> N >> M;
    if (N == 0 && M == 0)
      break;
    for (i = 0; i < 200; i++) {
      for (j = 0; j < 200; j++) {
        if (i != j) {
          disL[i][j] = inf;
          disS[i][j] = inf;
        } else {
          disL[i][i] = 0;
          disS[i][i] = 0;
        }
      }
    }

    /*陸路海路それぞれの最小値をセット*/
    for (i = 0; i < M; i++) {
      cin >> x >> y >> t >> ch;
      if (ch == 'L') {
        disL[x - 1][y - 1] = min(disL[x - 1][y - 1], t);
        disL[y - 1][x - 1] = min(disL[y - 1][x - 1], t);
      } else if (ch == 'S') {
        disS[x - 1][y - 1] = min(disS[x - 1][y - 1], t);
        disS[y - 1][x - 1] = min(disS[y - 1][x - 1], t);
      }
    }

    /*陸、海それぞれで各町同士の最短経路を出す*/
    for (i = 0; i < N; i++) {
      for (j = 0; j < N; j++) {
        for (k = 0; k < N; k++) {
          disL[j][k] = min(disL[j][k], disL[j][i] + disL[i][k]);
          disS[j][k] = min(disS[j][k], disS[j][i] + disS[i][k]);
        }
      }
    }
    cin >> r;
    for (i = 0; i < r; i++) {
      cin >> j;
      z[i] = j - 1; // 町番号は0からN-1にする
    }
    cout << recur(0, z[0]) << endl;
  }
}

Error: WA

Fixed submission:

#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;

#define inf 100000000

long long N, M;
long long disL[200][200]; // 隣接行列の重みバージョン陸
long long disS[200][200]; // 海
long long r;
long long z[1000];
long long disP[1000][100] = {};

/*町番号は0からN-1とする（入力は1からN）*/

/*町Z(num)からZr（終点）への最短時間（船が町shipにある状況で）を返す
z  宅配順列の何番目か0->(r-1)
ship 船のある町番号0->N-1
*/
long long recur(long long num, long long ship) {
  long long land, sea = inf, sm = ship, sp, i;

  if (disP[num][ship] != 0)
    return disP[num][ship];
  if (num >= r - 1)
    return 0;
  land = disL[z[num]][z[num + 1]] + recur(num + 1, ship);

  for (i = 0; i < N; i++) {
    sp = disL[z[num]][ship] + disS[ship][i] + disL[i][z[num + 1]] +
         recur(num + 1, i);
    if (sea > sp) {
      sea = sp;
    }
  }
  disP[num][ship] = min(land, sea);
  return disP[num][ship];
}

int main() {
  long long i, j, k, x, y, t;
  char ch;
  while (true) {

    for (i = 0; i < 1000; i++)
      for (j = 0; j < 100; j++)
        disP[i][j] = 0;

    /*入力処理*/
    cin >> N >> M;
    if (N == 0 && M == 0)
      break;
    for (i = 0; i < M; i++) {
      for (j = 0; j < M; j++) {
        if (i != j) {
          disL[i][j] = inf;
          disS[i][j] = inf;
        } else {
          disL[i][i] = 0;
          disS[i][i] = 0;
        }
      }
    }

    /*陸路海路それぞれの最小値をセット*/
    for (i = 0; i < M; i++) {
      cin >> x >> y >> t >> ch;
      if (ch == 'L') {
        disL[x - 1][y - 1] = min(disL[x - 1][y - 1], t);
        disL[y - 1][x - 1] = min(disL[y - 1][x - 1], t);
      } else if (ch == 'S') {
        disS[x - 1][y - 1] = min(disS[x - 1][y - 1], t);
        disS[x - 1][y - 1] = min(disS[x - 1][y - 1], t);
      }
    }

    priority_queue<long long> p_que;
    /*陸、海それぞれで各町同士の最短経路を出す*/
    for (i = 0; i < N; i++) {
      for (j = 0; j < N; j++) {
        for (k = 0; k < N; k++) {
          disL[j][k] = min(disL[j][k], disL[j][i] + disL[i][k]);
          disS[j][k] = min(disS[j][k], disS[j][i] + disS[i][k]);
        }
      }
    }
    cin >> r;
    for (i = 0; i < r; i++) {
      cin >> j;
      z[i] = j - 1; // 町番号は0からN-1にする
    }
    cout << recur(0, z[0]) << endl;
  }
}