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

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <utility>
#include <vector>
using namespace std;
#define pow2(a) (pow(1. * a, 2))
typedef struct D {
  int c, pp, np;
  double d;
  bool operator<(const D &a) const { return d > a.d; };
} D;

int N, X[21], Y[21], res = 0, g[21][21][21];
double R, O, d[21][21], F[21][21][10010];
double ang(int pre, int now, int next) {
  double a = d[pre][now], b = d[now][next], c = d[pre][next];
  double dd = acos((pow2(a) + pow2(b) - pow2(c)) / (2 * a * b));
  double df = 180 - (dd * 180 / 3.141592);
  return df;
}

int main() {
  scanf("%d%lf%lf", &N, &R, &O);
  memset(g, 0, sizeof(g));
  for (int i = 0; i < 21; i++)
    for (int k = 0; k < 21; k++)
      for (int j = 0; j < 10010; j++)
        F[i][k][j] = 1e14;
  for (int i = 0; i < N; i++)
    scanf("%d%d", X + i, Y + i);
  for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
      d[i][j] = sqrt(pow2(X[i] - X[j]) + pow2(Y[i] - Y[j]));
  for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
      for (int k = 0; k < N; k++)
        if (ang(i, j, k) < O)
          g[i][j][k] = 1;
  priority_queue<D> Q;
  for (int i = 1; i < N; i++) {
    if (d[0][i] > R)
      continue;
    D tmp = {1, 0, i, d[0][i]};
    F[0][i][1] = d[0][i];
    Q.push(tmp);
  }
  for (; !Q.empty();) {
    D tmp = Q.top();
    Q.pop();
    res = max(tmp.c, res);
    if (F[tmp.pp][tmp.np][tmp.c] - tmp.d > 0.001)
      continue;
    F[tmp.pp][tmp.np][tmp.c] = tmp.d;
    for (int i = 0; i < N; i++) {
      if (i == tmp.np)
        continue;
      if (g[tmp.pp][tmp.np][i] && tmp.d + d[tmp.np][i] <= R) {
        D ins = {tmp.c + 1, tmp.np, i, tmp.d + d[tmp.np][i]};
        if (F[ins.pp][ins.np][ins.c] - ins.d > 0.001) {
          Q.push(ins);
          F[ins.pp][ins.np][ins.c] = ins.d;
        }
      }
    }
  }
  printf("%d\\n", res);
  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <utility>
#include <vector>
using namespace std;
#define pow2(a) (pow(1. * a, 2))
typedef struct D {
  int c, pp, np;
  double d;
  bool operator<(const D &a) const { return d > a.d; };
} D;

int N, X[25], Y[25], res = 0, g[25][25][25];
double R, O, d[25][25], F[30][30][10010];
double ang(int pre, int now, int next) {
  double a = d[pre][now], b = d[now][next], c = d[pre][next];
  double dd = acos((pow2(a) + pow2(b) - pow2(c)) / (2 * a * b));
  double df = 180 - (dd * 180 / 3.141592);
  return df;
}

int main() {
  scanf("%d%lf%lf", &N, &R, &O);
  memset(g, 0, sizeof(g));
  for (int i = 0; i < 30; i++)
    for (int k = 0; k < 30; k++)
      for (int j = 0; j < 10010; j++)
        F[i][k][j] = 1e14;
  for (int i = 0; i < N; i++)
    scanf("%d%d", X + i, Y + i);
  for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
      d[i][j] = sqrt(pow2(X[i] - X[j]) + pow2(Y[i] - Y[j]));
  for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
      for (int k = 0; k < N; k++)
        if (ang(i, j, k) < O)
          g[i][j][k] = 1;
  priority_queue<D> Q;
  for (int i = 1; i < N; i++) {
    if (d[0][i] > R)
      continue;
    D tmp = {1, 0, i, d[0][i]};
    F[0][i][1] = d[0][i];
    Q.push(tmp);
  }
  for (; !Q.empty();) {
    D tmp = Q.top();
    Q.pop();
    res = max(tmp.c, res);
    if (F[tmp.pp][tmp.np][tmp.c] - tmp.d > 0.001)
      continue;
    F[tmp.pp][tmp.np][tmp.c] = tmp.d;
    for (int i = 0; i < N; i++) {
      if (i == tmp.np)
        continue;
      if (g[tmp.pp][tmp.np][i] && tmp.d + d[tmp.np][i] <= R) {
        D ins = {tmp.c + 1, tmp.np, i, tmp.d + d[tmp.np][i]};
        if (F[ins.pp][ins.np][ins.c] - ins.d > 0.001) {
          Q.push(ins);
          F[ins.pp][ins.np][ins.c] = ins.d;
        }
      }
    }
  }
  printf("%d\\n", res);
  return 0;
}