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

#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
#define MAX 10000
#define INFTY (1 << 20)
#define WHITE 0 // 未発見
#define GRAY 1  // 発見済み未確定
#define BLACK 2 // 確定済み

int n; // num of vertexes
vector<pair<int, int>>
    v_list[MAX +
           1]; // 頂点の隣接リスト(vector)を要素として持つ配列(添え字が頂点番号)

// http://homepage2.nifty.com/well/Operator.html#PAREN
class greaterInt {
public:
  bool operator()(pair<int, int> &a, pair<int, int> &b) {
    return a.second > b.second;
  }
};

void dijkstra() {
  priority_queue<pair<int, int>, vector<pair<int, int>>, greaterInt>
      PQ;         //<頂点番号,挿入時点での最短距離>
  int color[MAX]; // 各頂点の状態を格納する配列
  int d[MAX]; // 各頂点までの現在の最短距離を格納する変数

  for (int i = 0; i < n; i++) {
    d[i] = INFTY;
    color[i] = WHITE;
  }

  d[0] = 0;
  PQ.push(
      make_pair(0, 0)); // make_pairを使うと勝手にpairで宣言した型に直してくれる
  color[0] = GRAY;

  // PQ.empty() ==
  // trueのときこれ以上更新はなくこれまであった更新に関してはすべて処理
  // が終わっている状態
  while (!PQ.empty()) {
    pair<int, int> f = PQ.top();
    PQ.pop();
    int u = f.first; // 今回確定する頂点番号

    if (color[u] == BLACK)
      continue; // continue break http://kotazi.com/archives/1383
    // 以下ではf.second == d[u]が保障される

    color[u] = BLACK;

    for (int j = 0; j < v_list[u].size(); j++) {
      int v =
          v_list[u][j]
              .first; // はじめの[]は配列要素番号，二つ目の[]はベクトルの要素番号
      if (color[v] == BLACK)
        continue;
      if (d[v] > d[u] + v_list[u][j].second) {
        d[v] = d[u] + v_list[u][j].second;
        PQ.push(make_pair(v, d[v]));
        color[v] = GRAY;
      }
    }
  }

  for (int i = 0; i < n; i++) {
    cout << i << " " << (d[i] == INFTY ? -1 : d[i])
         << endl; // http://msmori.blogspot.jp/2011/01/3.html
    // cout <<i <<" " <<d[i] <<endl;
  }
}

int main() {
  int k, u, v, c;

  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> u >> k;
    for (int j = 0; j < k; j++) {
      cin >> v >> c;
      v_list[u].push_back(make_pair(v, c));
    }
  }
  dijkstra();

  return 0;
}

Error: 0

Fixed submission:

// さっさと済ませられるところはさっさと済ましてしまう．ただし注意深く
#include <cstdio>
#include <iostream>
#define MAX_VERTEXES 100
#define NIL -1
#define INFTY 20000000 // >100*100000

using namespace std;

// think easy make easy

int n;                                                // num of vertexes(頂点)
int matrix_graph[MAX_VERTEXES + 1][MAX_VERTEXES + 1]; // 0オリジン
bool vertex_set[MAX_VERTEXES + 1];                    /// 0オリジン
int current_mincost[MAX_VERTEXES + 1]; // 現時点での各頂点への最小コスト
bool candidate[MAX_VERTEXES + 1]; // 次にvertex_setに加える頂点の候補
int new_vertex;

void findNextVertex() {
  int min_tmp = INFTY;
  int next_tmp = NIL;

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (i == new_vertex &&
          vertex_set[j] == false) { // わかりやすいプログラムほど処理もすくない.
        // 無駄のないプログラムの方がわかりよい
        if (matrix_graph[i][j] + current_mincost[i] < current_mincost[j] &&
            matrix_graph[i][j] != NIL) {
          current_mincost[j] = matrix_graph[i][j] + current_mincost[i];
          candidate[j] = true;
        }
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (candidate[i] == true && current_mincost[i] < min_tmp) {
      min_tmp = current_mincost[i];
      next_tmp = i;
    }
  }
  vertex_set[next_tmp] = true;
  candidate[next_tmp] = false;
  new_vertex = next_tmp;
}

int main() {
  scanf("%d", &n);

  int v_num;
  int k; // v_numの出次数

  for (int i = 0; i < n; i++) {
    for (int j = 0; j <= n; j++) {
      matrix_graph[i][j] = NIL;
    }
  }

  for (int i = 0; i < n; i++) {
    scanf("%d", &v_num);
    scanf("%d", &k);

    for (int j = 0; j < k; j++) {
      int v_num2;
      int cst;
      scanf("%d", &v_num2);
      scanf("%d", &cst);
      matrix_graph[v_num][v_num2] = cst;
    }
  }

  for (int i = 0; i < n; i++) {
    vertex_set[i] = false;
    current_mincost[i] = INFTY;
  }
  /*確認用
  for(int i=0;i<n;i++){
          for(int j=0;j<n;j++){
                  if(j<n-1) printf("%d ",matrix_graph[i][j]);
                  else printf("%d\\n",matrix_graph[i][j]);
          }
  }
  */

  for (int i = 0; i < n; i++) {
    candidate[i] = false;
  }

  vertex_set[0] = true;
  current_mincost[0] = 0;
  new_vertex = 0;

  for (int i = 1; i < n; i++) {
    // for(int j=0;j<n;j++){
    // cout <<" " <<vertex_set[j] ;
    //}
    // cout <<endl;
    findNextVertex();
  }

  for (int i = 0; i < n; i++) {
    cout << i << " " << current_mincost[i] << endl;
  }

  return 0;
}