Problem p04003 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;

struct State {
  int id;
  int c;
  int cost;
  State(int aa, int bb, int cc) {
    id = aa;
    c = bb;
    cost = cc;
  }
  bool operator<(const State &right) const { return cost > right.cost; }
};

struct Edge {
  long long to;
  int cost;
  Edge(long long a, int b) {
    to = a;
    cost = b;
  }
};

struct Data {
  int id;
  int c;
  int cost;
  bool visit;
  vector<Edge> next;
  Data(int a = -1, int b = -1, int cc = 2 << 28) {
    id = a;
    c = b;
    cost = cc;
    visit = false;
    next.reserve(100);
  }

  bool operator<(const Data &right) const { return cost < right.cost; }
};

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  std::unordered_map<long long, Data> Map;
  long long PP = 1000005;
  int INF = 2 << 28;
  int N, M;
  cin >> N >> M;
  int p[M];
  int q[M];
  int c[M];
  for (int i = 0; i < M; i++) {
    cin >> p[i] >> q[i] >> c[i];
  }
  for (int i = 1; i <= N; i++) {
    Map[i * PP - 1] = Data(i, -1);
  }
  for (int I = 0; I < M; I++) {
    int P = p[I];
    int Q = q[I];
    int C = c[I];
    long long PPP = P * PP;
    long long QQQ = Q * PP;
    if (Map.find(PPP + C) == Map.end()) {
      Data tmp = Data(P, C);
      tmp.next.push_back(Edge(PPP - 1, 0));
      Map[PPP + C] = tmp;
      Map[PPP - 1].next.push_back(Edge(PPP + C, 1));
    }
    if (Map.find(QQQ + C) == Map.end()) {
      Data tmp = Data(Q, C);
      tmp.next.push_back(Edge(QQQ - 1, 0));
      Map[QQQ + C] = tmp;
      Map[QQQ - 1].next.push_back(Edge(QQQ + C, 1));
    }
    Map[PPP + C].next.push_back(Edge(QQQ + C, 0));
    Map[QQQ + C].next.push_back(Edge(PPP + C, 0));
  }
  priority_queue<State> Q;
  Q.push(State(1, -1, 0));
  while (!Q.empty()) {
    State pp = Q.top();
    Q.pop();
    if (pp.id == N) {
      Map[N * PP - 1].cost = pp.cost;
      break;
    }
    Data *nn = &Map[pp.id * PP + pp.c];
    if (nn->visit)
      continue;
    nn->visit = true;

    int pns = nn->next.size();
    for (int i = 0; i < pns; i++) {
      Edge next = nn->next.at(i);
      Data *nextD = &Map[next.to];
      if (nextD->cost <= pp.cost + next.cost)
        continue;
      State st = State(nextD->id, nextD->c, pp.cost + next.cost);
      nextD->cost = pp.cost + next.cost;
      Q.push(st);
    }
  }
  Data goal = Map[N * PP - 1];
  if (goal.cost == INF) {
    cout << -1 << endl;
  } else {
    cout << goal.cost << endl;
  }
}


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

struct State {
  int id;
  int c;
  int cost;
  State(int aa, int bb, int cc) {
    id = aa;
    c = bb;
    cost = cc;
  }
  bool operator<(const State &right) const { return cost > right.cost; }
};

struct Edge {
  long long to;
  int cost;
  Edge(long long a, int b) {
    to = a;
    cost = b;
  }
};

struct Data {
  int id;
  int c;
  int cost;
  bool visit;
  vector<Edge> next;
  Data(int a = -1, int b = -1, int cc = 2 << 28) {
    id = a;
    c = b;
    cost = cc;
    visit = false;
    next.reserve(10);
  }

  bool operator<(const Data &right) const { return cost < right.cost; }
};

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  std::unordered_map<long long, Data> Map;
  long long PP = 1000005;
  int INF = 2 << 28;
  int N, M;
  cin >> N >> M;
  int p[M];
  int q[M];
  int c[M];
  for (int i = 0; i < M; i++) {
    cin >> p[i] >> q[i] >> c[i];
  }
  for (int i = 1; i <= N; i++) {
    Map[i * PP - 1] = Data(i, -1);
  }
  for (int I = 0; I < M; I++) {
    int P = p[I];
    int Q = q[I];
    int C = c[I];
    long long PPP = P * PP;
    long long QQQ = Q * PP;
    if (Map.find(PPP + C) == Map.end()) {
      Data tmp = Data(P, C);
      tmp.next.push_back(Edge(PPP - 1, 0));
      Map[PPP + C] = tmp;
      Map[PPP - 1].next.push_back(Edge(PPP + C, 1));
    }
    if (Map.find(QQQ + C) == Map.end()) {
      Data tmp = Data(Q, C);
      tmp.next.push_back(Edge(QQQ - 1, 0));
      Map[QQQ + C] = tmp;
      Map[QQQ - 1].next.push_back(Edge(QQQ + C, 1));
    }
    Map[PPP + C].next.push_back(Edge(QQQ + C, 0));
    Map[QQQ + C].next.push_back(Edge(PPP + C, 0));
  }
  priority_queue<State> Q;
  Q.push(State(1, -1, 0));
  while (!Q.empty()) {
    State pp = Q.top();
    Q.pop();
    if (pp.id == N) {
      Map[N * PP - 1].cost = pp.cost;
      break;
    }
    Data *nn = &Map[pp.id * PP + pp.c];
    if (nn->visit)
      continue;
    nn->visit = true;

    int pns = nn->next.size();
    for (int i = 0; i < pns; i++) {
      Edge next = nn->next.at(i);
      Data *nextD = &Map[next.to];
      if (nextD->cost <= pp.cost + next.cost)
        continue;
      State st = State(nextD->id, nextD->c, pp.cost + next.cost);
      nextD->cost = pp.cost + next.cost;
      Q.push(st);
    }
  }
  Data goal = Map[N * PP - 1];
  if (goal.cost == INF) {
    cout << -1 << endl;
  } else {
    cout << goal.cost << endl;
  }
}