Problem p02364 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <climits>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

/*
 * ??\\??????Prim??????????????°??????
 * ?¢???????????????????X?????????????????¢???????????????X???????????????????????¨??§????°???¨?????¨????±???????
 */

#define MAX_E 10001
#define MAX_V 100001
#define INF INT_MAX

typedef struct edge {
  int from;
  int to;
  int cost;
} edge;

// cost???????????????
struct cost_cmp {
  bool operator()(edge x, edge y) const { return (x.cost) > (y.cost); }
};

vector<edge> G[MAX_V];

//?????????i?????¢???X??????????????????????????????????????¨???????????°
bool used[MAX_V];

/*
 * start:????§??????????
 */
int Prim(int start) {

  int res = 0;
  edge e = {0, 0, 0};

  //????????????????????\\??????cost???????????????????????????
  priority_queue<edge, vector<edge>, cost_cmp> que;

  //?????????
  que.push(e);

  while (!que.empty()) {
    edge p = que.top();
    que.pop();

    // v????¬?????¢????????????????X??????????????????
    int v = p.to;

    /*
     * v?????¢????¢???????????????????X???????????????????????´???????????????????????????
     */
    if (used[v])
      continue;

    // v?????????X???????????????????¢??????????????????°????????????
    used[v] = true;

    res += p.cost;

    /*
     * v?????????????????¨???????????????????????¨????????????to????¢?????????????????????§????????????
     * ??????????????\\????????¨?????????????´???????
     */
    for (int i = 0; i < G[v].size(); i++) {
      int to = G[v][i].to;
      if (!used[to])
        que.push(G[v][i]);
    }
  }
  return res;
}

int main() {

  int i, V, E, u, v, c, ans;
  cin >> V >> E;
  edge tmp;

  for (i = 0; i < E; i++) {
    cin >> u >> v >> c;
    edge tmp;
    tmp.from = u;
    tmp.to = v;
    tmp.cost = c;
    G[u].push_back(tmp);

    tmp.from = v;
    tmp.to = u;
    G[v].push_back(tmp);
  }

  ans = Prim(0);

  cout << ans << endl;

  return 0;
}

Error: MLE

Fixed submission:

#include <climits>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

/*
 * ??\\??????Prim??????????????°??????
 * ?¢???????????????????X?????????????????¢???????????????X???????????????????????¨??§????°???¨?????¨????±???????
 */

#define NODE_NUM 10001
#define INF INT_MAX

//???uv????????????????????¨???????????´??????INF???????´?
int cost[NODE_NUM][NODE_NUM];

//??????X?????????????°?????????????
int mincost[NODE_NUM];

//?????????i???X???????????????????????????
bool used[NODE_NUM];

/*
 * n:?????????????????°
 */
int Prim(int n) {

  for (int i = 0; i < n; i++) {
    mincost[i] = INF;
    used[i] = false;
  }
  //????????????????????????????????????
  mincost[0] = 0;
  int res = 0;

  while (true) {
    int v = -1;

    // X????±???????????????????????????????X???????????????????????????????°???????????????????v????±???????
    for (int u = 0; u < n; u++) {
      if (!used[u] && (v == -1 || mincost[u] < mincost[v])) {
        v = u;
      }
    }

    // v???-1???????????§????????´????????¢?????¨??????????????????X?????????????????????
    if (v == -1)
      break;

    //??????v???X?????????
    used[v] = true;
    //???????????????????????????
    res += mincost[v];
    //?¢???????????????????X????????????????????¢????????????????????????v????????????????????????????????§??´??°??§????????´????????´??°?????????
    for (int u = 0; u < n; u++) {
      mincost[u] = min(mincost[u], cost[v][u]);
    }
  }

  return res;
}

int main() {

  int i, V, E, u, v, c;
  cin >> V >> E;

  //????????????????????????0???????????\\??????INF??¨??????
  for (int i = 0; i < V; i++) {
    for (int j = 0; j < V; j++) {
      if (i == j)
        cost[i][j] = 0;
      else
        cost[i][j] = INF;
    }
  }

  for (i = 0; i < E; i++) {
    cin >> u >> v >> c;
    cost[u][v] = c;
    cost[v][u] = c;
  }

  cout << Prim(V) << endl;

  return 0;
}