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

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define rep(i, j) REP((i), 0, (j))
#define REP(i, j, k) for (int i = (j); (i) < (k); ++i)
#define BW(a, x, b) ((a) <= (x) && (x) <= (b))
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define INF 1 << 30
#define EPS 1e-10

typedef pair<int, int> pi;
typedef pair<int, pi> pii;
typedef vector<int> vi;
typedef queue<int> qi;
typedef long long ll;

int n;
int hx, hy, dx, dy, cx[21], cy[21];

double dist(double ax, double ay, double bx, double by) {
  return sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
}

int dfs(int c, double t, int x, int y, int *used) {
  //  printf("%d %lf %lf %lf\\n", c, t, x, y);
  if (c == n)
    return 1;

  rep(i, n) {
    if (used[i])
      continue;
    if (t + dist(x, y, cx[i], cy[i]) + EPS > dist(dx, dy, cx[i], cy[i]))
      return 0;
  }

  rep(i, n) {
    if (used[i])
      continue;
    double nt = dist(x, y, cx[i], cy[i]);
    //    printf("x:%lf y:%lf nt:%lf\\n", x, y, nt);
    //    printf("dx;%lf dy:%lf cx:%lf cy:%lf\\n", dx, dy, cx[i], cy[i]);
    //    printf("%lf %lf\\n", t + nt + EPS, dist(dx, dy, cx[i], cy[i]));
    if (t + nt + EPS > dist(dx, dy, cx[i], cy[i]))
      return 0;
    used[i] = 1;
    if (dfs(c + 1, t + nt, cx[i], cy[i], used))
      return 1;
    used[i] = 0;
  }
  return 0;
}

int main() {
  while (scanf("%d%d%d%d%d", &n, &hx, &hy, &dx, &dy) && n + hx + hy + dx + dy) {
    rep(i, n) scanf("%d%d", cx + i, cy + i);
    ;

    int used[21];
    memset(used, 0, sizeof(used));
    if (dfs(0, 0, hx, hy, used))
      puts("YES");
    else
      puts("NO");
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define rep(i, j) REP((i), 0, (j))
#define REP(i, j, k) for (int i = (j); (i) < (k); ++i)
#define BW(a, x, b) ((a) <= (x) && (x) <= (b))
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define INF 1 << 30
#define EPS 1e-10

typedef pair<int, int> pi;
typedef pair<int, pi> pii;
typedef vector<int> vi;
typedef queue<int> qi;
typedef long long ll;

int n;
int hx, hy, dx, dy, cx[21], cy[21];

double dist(double ax, double ay, double bx, double by) {
  return sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
}

int dfs(int c, double t, int x, int y, int *used) {
  //  printf("%d %lf %lf %lf\\n", c, t, x, y);
  if (c == n)
    return 1;

  rep(i, n) {
    if (used[i])
      continue;
    double nt = dist(x, y, cx[i], cy[i]);
    //    printf("x:%lf y:%lf nt:%lf\\n", x, y, nt);
    //    printf("dx;%lf dy:%lf cx:%lf cy:%lf\\n", dx, dy, cx[i], cy[i]);
    //    printf("%lf %lf\\n", t + nt + EPS, dist(dx, dy, cx[i], cy[i]));
    if (t + nt + EPS > dist(dx, dy, cx[i], cy[i]))
      return 0;
    used[i] = 1;
    if (dfs(c + 1, t + nt, cx[i], cy[i], used))
      return 1;
    used[i] = 0;
  }
  return 0;
}

int main() {
  while (scanf("%d%d%d%d%d", &n, &hx, &hy, &dx, &dy) && n + hx + hy + dx + dy) {
    rep(i, n) scanf("%d%d", cx + i, cy + i);
    ;

    int used[21];
    memset(used, 0, sizeof(used));
    if (dfs(0, 0, hx, hy, used))
      puts("YES");
    else
      puts("NO");
  }
  return 0;
}