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

// #include<bits/stdc++.h>
#define _CRT_SBCURE_NO_DEPRECATE
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
// #define UP(i,x,y) for(int i=x;i<=y;i++)
// #define DOWN(i,x,y) for(int i=x;i>=y;i--)
#define sdddd(x, y, z, k) scanf("%d%d%d%d", &x, &y, &z, &k)
#define sddd(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define sdd(x, y) scanf("%d%d", &x, &y)
#define sd(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define lson k << 1
#define rson k << 1 | 1
#define mid (l + r) / 2
#define ms(x, y) memset(x, y, sizeof x)
using namespace std;
typedef long long ll;
// typedef unsigned long long ull;
#define MOD 142857
const int maxn = 10100;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
int n, m, s, t;
int len;
struct road {
  int u, v, len, cost;
  int next;
};
struct node {
  int v;
  int len;
  int cost;
  node(int v, int l, int c) : v(v), len(l), cost(c) {}
  friend bool operator<(node a, node b) { return a.len > b.len; }
};
road G[maxn * 5];
int h[maxn];
int mx = -INF;
int d[maxn];
int c[maxn];
int path[maxn];
void dij() {
  fill(d, d + n + 1, INF);
  fill(path, path + n + 1, -1);
  fill(c, c + n + 1, 0);
  d[1] = 0;
  priority_queue<node> pque;
  pque.push(node(1, 0, 0));
  while (pque.size()) {
    node p = pque.top();
    pque.pop();
    int v = p.v;
    if (d[v] < p.len)
      continue;
    for (int i = h[v]; i != -1; i = G[i].next) {
      road e = G[i];
      if (d[e.v] > d[e.u] + e.len) {
        d[e.v] = d[e.u] + e.len;
        c[e.v] = c[e.u] + e.cost;
        path[e.v] = i;
        pque.push(node(e.v, d[e.v], c[e.v]));
      } else if (d[e.v] == d[e.u] + e.len) {
        if (path[e.v] != -1 && G[path[e.v]].cost > e.cost) {
          path[e.v] = i;
          pque.push(node(e.v, d[e.v], c[e.v]));
        }
      }
    }
  }
}
int main() {
  // freopen("out.txt", "w", stdout);
  while (~sdd(n, m) && (n || m)) {
    int ta, tb, tc, td;
    int len = 0;
    fill(h, h + n + 1, -1);
    for (int i = 0; i < m; i++) {
      sdddd(ta, tb, tc, td);
      G[len].u = ta;
      G[len].v = tb;
      G[len].len = tc;
      G[len].cost = td;
      G[len].next = h[ta];
      h[ta] = len++;

      G[len].u = tb;
      G[len].v = ta;
      G[len].len = tc;
      G[len].cost = td;
      G[len].next = h[tb];
      h[tb] = len++;
    }
    dij();
    int ans = 0;
    for (int i = 1; i <= n; i++) {
      if (path[i] != -1) {
        ans += G[path[i]].cost;
      }
    }
    printf("%d\\n", ans);
  }

  return 0;
}


Error: MLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define N 0x3f3f3f3f
using namespace std;
int n, m;
int map[10010][10010];
int mapp[10010][10010];
int vis[10010];
int value[10010];
int s[10010];
void spfa() {
  memset(vis, 0, sizeof(vis));
  memset(s, N, sizeof(s));
  s[1] = 0;
  queue<int> q;
  q.push(1);
  while (q.size()) {
    int t = q.front();
    q.pop();
    vis[t] = 0;
    for (int i = 1; i <= n; i++) {
      if (s[t] + map[t][i] < s[i]) {
        s[i] = map[t][i] + s[t];
        value[i] = mapp[t][i];
        if (vis[i] == 0) {
          vis[i] == 1;
          q.push(i);
        }
      }
      if (s[t] + map[t][i] == s[i]) {
        if (value[i] > mapp[t][i])
          value[i] = mapp[t][i];
      }
    }
  }
  int h = 0;
  for (int i = 1; i <= n; i++) {
    h += value[i];
  }
  cout << h << endl;
}
int main() {

  while (cin >> n >> m) {
    if (n == 0 && m == 0) {
      break;
    }
    memset(map, N, sizeof(map));
    memset(mapp, N, sizeof(mapp));
    for (int i = 1; i <= m; i++) {
      int a, b, c, d;
      cin >> a >> b >> c >> d;
      if (map[a][b] > c) {
        map[a][b] = map[b][a] = c;
      }
      if (mapp[a][b] > d) {
        mapp[a][b] = mapp[b][a] = d;
      }
    }
    spfa();
  }
  return 0;
}