Problem p00212 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <vector>

const int MAX_V = 101;
const int INF = 0x3f3f3f3f;

//??? T???cap??????rev????????°???????????§?????£???????????????
struct Edge {
  int to;
  int cost;
  Edge(int to_, int cost_) : to(to_), cost(cost_) {}
};

std::vector<Edge> G[MAX_V]; //??£??\?????????

int d[11][MAX_V]; //[?????¨???????????±??????????????°][?????????]
int pre[MAX_V];

void AddEdge(int from, int to, int cost) { G[from].push_back(Edge(to, cost)); }

void ClearEdge() {
  for (int i = 0; i < MAX_V; ++i)
    G[i].clear();
  memset(d, 0, sizeof(d));
  memset(pre, -1, sizeof(pre));
}

void Dijkstra(int c, int s) {
  typedef std::pair<int, int> P; // first:???????????¢, second:????????????

  std::priority_queue<P, std::vector<P>, std::greater<P>> q;
  std::fill(d[c], d[c] + MAX_V, INF);
  memset(pre, -1, sizeof(pre));
  d[c][s] = 0;
  q.push(P(0, s));

  while (!q.empty()) {
    P p = q.top();
    q.pop();
    int from = p.second;
    if (d[c][from] < p.first)
      continue;
    for (Edge e : G[from]) {
      int dmin;
      if (c == 0)
        dmin = d[c][from] + e.cost;
      else
        dmin = std::min(d[c][from] + e.cost, d[c - 1][from] + e.cost / 2);

      if (d[c][e.to] > dmin) {
        d[c][e.to] = dmin;
        q.push(P(d[c][e.to], e.to));
        pre[e.to] = from;
      }
    }
  }
}

std::vector<int> GetPath(int t) {
  std::vector<int> path;
  for (; t != -1; t = pre[t])
    path.push_back(t);
  std::reverse(path.begin(), path.end());

  return path;
}

using namespace std;

int main(void) {
  int c, n, m, s, g;
  while (1) {
    cin >> c >> n >> m >> s >> g;
    if (c == n && n == m && m == s && s == g && g == 0)
      return 0;
    int a, b, f;
    for (int i = 0; i < n; ++i) {
      cin >> a >> b >> f;
      AddEdge(a, b, f);
      AddEdge(b, a, f);
    }
    for (int i = 0; i <= c; ++i) {
      Dijkstra(i, s);
    }
    cout << d[c][g] << endl;
    ClearEdge();
  }
}

Fixed submission:
#include <algorithm>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <vector>

const int MAX_V = 101;
const int INF = 0x3f3f3f3f;

//??? T???cap??????rev????????°???????????§?????£???????????????
struct Edge {
  int to;
  int cost;
  Edge(int to_, int cost_) : to(to_), cost(cost_) {}
};

std::vector<Edge> G[MAX_V]; //??£??\?????????

int d[11][MAX_V]; //[?????¨???????????±??????????????°][?????????]
int pre[MAX_V];

void AddEdge(int from, int to, int cost) { G[from].push_back(Edge(to, cost)); }

void ClearEdge() {
  for (int i = 0; i < MAX_V; ++i)
    G[i].clear();
  memset(d, 0, sizeof(d));
  memset(pre, -1, sizeof(pre));
}

void Dijkstra(int c, int s) {
  typedef std::pair<int, int> P; // first:???????????¢, second:????????????

  std::priority_queue<P, std::vector<P>, std::greater<P>> q;
  std::fill(d[c], d[c] + MAX_V, INF);
  memset(pre, -1, sizeof(pre));
  d[c][s] = 0;
  q.push(P(0, s));

  while (!q.empty()) {
    P p = q.top();
    q.pop();
    int from = p.second;
    if (d[c][from] < p.first)
      continue;
    for (Edge e : G[from]) {
      int dmin;
      if (c == 0)
        dmin = d[c][from] + e.cost;
      else
        dmin = std::min(d[c][from] + e.cost, d[c - 1][from] + e.cost / 2);

      if (d[c][e.to] > dmin) {
        d[c][e.to] = dmin;
        q.push(P(d[c][e.to], e.to));
        pre[e.to] = from;
      }
    }
  }
}

std::vector<int> GetPath(int t) {
  std::vector<int> path;
  for (; t != -1; t = pre[t])
    path.push_back(t);
  std::reverse(path.begin(), path.end());

  return path;
}

using namespace std;

int main(void) {
  int c, n, m, s, g;
  while (1) {
    cin >> c >> n >> m >> s >> g;
    if (c == n && n == m && m == s && s == g && g == 0)
      return 0;
    int a, b, f;
    for (int i = 0; i < m; ++i) {
      cin >> a >> b >> f;
      AddEdge(a, b, f);
      AddEdge(b, a, f);
    }
    for (int i = 0; i <= c; ++i) {
      Dijkstra(i, s);
    }
    cout << d[c][g] << endl;
    ClearEdge();
  }
}