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

#include <bits/stdc++.h>
#define INF 1e9
using namespace std;
struct P {
  double cost;
  int pos, pre, num;
  P(double cost, int pos, int pre, int num)
      : cost(cost), pos(pos), pre(pre), num(num) {}
  bool operator<(const P &a) const { return cost > a.cost; }
};
typedef complex<double> point;
point z[21];
int n;
double r, x;
vector<P> e[21][21];
bool check(point a, point b) {
  a *= conj(b);
  return 180.0 * (abs(arg(a)) / M_PI) <= x;
}

double D[10001][21][21];
int dijkstra() {
  int res = 0;
  for (int i = 0; i < 10001; i++)
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++)
        D[i][j][k] = INF;
  priority_queue<P> Q;
  Q.push(P(0, 0, 0, 0));
  D[0][0][0] = 0;

  while (!Q.empty()) {
    P t = Q.top();
    Q.pop();
    double cost = t.cost;
    int pos = t.pos, pre = t.pre, num = t.num;
    if (cost > r)
      continue;
    if (D[num][pos][pre] < cost)
      continue;
    res = max(res, num);
    for (int i = 0; i < e[pos][pre].size(); i++) {
      int nx = e[pos][pre][i].pos;
      double ncost = cost + e[pos][pre][i].cost;
      double &a = D[num + 1][nx][pos];
      if (a > ncost) {
        Q.push(P(ncost, nx, pos, num + 1));
        a = ncost;
      }
    }
  }
  return res;
}

int main() {
  cin >> n >> r >> x;
  for (int i = 0; i < n; i++) {
    double a, b;
    cin >> a >> b;
    z[i] = point(a, b);
  }

  for (int i = 0; i < n; i++)       // pos
    for (int j = 0; j < n; j++)     // pre
      for (int k = 0; k < n; k++) { // to
        double cost = abs(z[i] - z[k]);
        if (i != k && i != j && check(z[i] - z[j], z[k] - z[i]))
          e[i][j].push_back(P(cost, k, 0, 0));
      }

  for (int i = 1; i < n; i++)
    e[0][0].push_back(P(abs(z[0] - z[i]), i, 0, 0));
  cout << dijkstra() << endl;
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define INF 1e9
using namespace std;
struct P {
  double cost;
  int pos, pre, num;
  P(double cost, int pos, int pre, int num)
      : cost(cost), pos(pos), pre(pre), num(num) {}
  bool operator<(const P &a) const { return cost < a.cost; }
};
typedef complex<double> point;
point z[21];
int n;
double r, x;
vector<P> e[21][21];
bool check(point a, point b) {
  a *= conj(b);
  return 180.0 * (abs(arg(a)) / M_PI) <= x;
}

double D[10001][21][21];
int dijkstra() {
  int res = 0;
  for (int i = 0; i < 10001; i++)
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++)
        D[i][j][k] = INF;
  priority_queue<P> Q;
  Q.push(P(0, 0, 0, 0));
  D[0][0][0] = 0;

  while (!Q.empty()) {
    P t = Q.top();
    Q.pop();
    double cost = t.cost;
    int pos = t.pos, pre = t.pre, num = t.num;
    if (cost > r)
      continue;
    if (D[num][pos][pre] < cost)
      continue;
    res = max(res, num);
    for (int i = 0; i < e[pos][pre].size(); i++) {
      int nx = e[pos][pre][i].pos;
      double ncost = cost + e[pos][pre][i].cost;
      double &a = D[num + 1][nx][pos];
      if (a > ncost) {
        Q.push(P(ncost, nx, pos, num + 1));
        a = ncost;
      }
    }
  }
  return res;
}

int main() {
  cin >> n >> r >> x;
  for (int i = 0; i < n; i++) {
    double a, b;
    cin >> a >> b;
    z[i] = point(a, b);
  }

  for (int i = 0; i < n; i++)       // pos
    for (int j = 0; j < n; j++)     // pre
      for (int k = 0; k < n; k++) { // to
        double cost = abs(z[i] - z[k]);
        if (i != k && i != j && check(z[i] - z[j], z[k] - z[i]))
          e[i][j].push_back(P(cost, k, 0, 0));
      }

  for (int i = 1; i < n; i++)
    e[0][0].push_back(P(abs(z[0] - z[i]), i, 0, 0));
  cout << dijkstra() << endl;
  return 0;
}