Problem p01350 (C++) — buggy submission, verdict: Runtime Error

#include "bits/stdc++.h"
using namespace std;
// http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2233&lang=jp
typedef long long ll;
typedef long double ld;
#define INF 1 << 30
#define LINF 1 << 60
const double eps = 1e-9;

inline double calc_w(int c1, int pre_c1, int c2, int pre_c2,
                     vector<pair<int, int>> &city) {
  double l1_x = city[c1].first - city[pre_c1].first;
  double l1_y = city[c1].second - city[pre_c1].second;

  double l2_x = city[c2].first - city[pre_c2].first;
  double l2_y = city[c2].second - city[pre_c2].second;

  double _cos = (l1_x * l2_x + l1_y * l2_y) /
                (double)(hypot(l1_x, l1_y) * hypot(l2_x, l2_y));
  if (1 - _cos < eps)
    return 0.0;
  if (1 + _cos < eps)
    return 180.0;
  return abs(acos(_cos) * 180 / acos(-1));
}

struct edge {
  int now_city;
  int pre_city;
  int have_carrot;
  double full_len;
  edge() {}
  edge(int now, int pre, int car, double len)
      : now_city(now), pre_city(pre), have_carrot(car), full_len(len) {}
};

int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  /* input */
  int n;
  cin >> n;
  double r, theta;
  cin >> r >> theta;
  vector<pair<int, int>> city(n);
  for (int i = 0; i < n; i++) {
    int x, y;
    cin >> x >> y;
    city[i] = {x, y};
  }

  /* initialize */
  vector<vector<double>> dist(n, vector<double>(n, 0));
  vector<vector<vector<int>>> G(n, vector<vector<int>>(n));
  vector<vector<vector<double>>> dp(
      n, vector<vector<double>>(n, vector<double>(10010, INF)));

  int ans = 0;
  queue<edge> q;
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      double d =
          hypot(city[i].first - city[j].first, city[i].second - city[j].second);
      dist[i][j] = dist[j][i] = d;
      if ((i == 0) && (d <= r)) {
        dp[j][i][1] = d;
        q.push(edge(j, i, 1, d));
        ans = 1;
      }
    }
  }

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        if (i == j || j == k || i == k)
          continue;
        if (calc_w(j, i, k, j, city) < theta + eps)
          G[j][i].push_back(k);
      }
    }
  }

  while (!q.empty()) {
    auto p = q.front();
    q.pop();
    int now_city = p.now_city, pre_city = p.pre_city;
    int have_carrot = p.have_carrot;
    double len = p.full_len;
    if (len > dp[now_city][pre_city][have_carrot])
      continue;
    for (int next_city : G[now_city][pre_city]) {
      if (next_city == now_city || next_city == pre_city)
        continue;
      if (dist[now_city][next_city] + len < r + eps) {
        if (dp[next_city][now_city][have_carrot + 1] >
            len + dist[next_city][now_city]) {
          dp[next_city][now_city][have_carrot + 1] =
              len + dist[next_city][now_city];
          q.push(edge(next_city, now_city, have_carrot + 1,
                      dist[next_city][now_city] + len));
          ans = max(ans, have_carrot + 1);
        }
      }
    }
  }
  cout << ans << endl;
}

Error: 0

Fixed submission:

#include "bits/stdc++.h"
using namespace std;
// http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2233&lang=jp
typedef long long ll;
typedef long double ld;
#define INF 1 << 30
#define LINF 1 << 60
const double eps = 1e-9;

inline double calc_w(int c1, int pre_c1, int c2, int pre_c2,
                     vector<pair<int, int>> &city) {
  double l1_x = city[c1].first - city[pre_c1].first;
  double l1_y = city[c1].second - city[pre_c1].second;

  double l2_x = city[c2].first - city[pre_c2].first;
  double l2_y = city[c2].second - city[pre_c2].second;

  double _cos = (l1_x * l2_x + l1_y * l2_y) /
                (double)(hypot(l1_x, l1_y) * hypot(l2_x, l2_y));
  if (1 - _cos < eps)
    return 0.0;
  if (1 + _cos < eps)
    return 180.0;
  return abs(acos(_cos) * 180 / acos(-1));
}

struct edge {
  int now_city;
  int pre_city;
  double full_len;
  edge() {}
  edge(int now, int pre, double len)
      : now_city(now), pre_city(pre), full_len(len) {}
};

int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  /* input */
  int n;
  cin >> n;
  double r, theta;
  cin >> r >> theta;
  vector<pair<int, int>> city(n);
  for (int i = 0; i < n; i++) {
    int x, y;
    cin >> x >> y;
    city[i] = {x, y};
  }

  /* initialize */
  /* carrot[i][j] := the number of carrots from j-th city to i-th city */
  vector<vector<int>> carrot(n, vector<int>(n, 0));
  /* dist[i][j] := distance between i-th city and j-th city */
  vector<vector<double>> dist(n, vector<double>(n, 0));
  /* w[i][j][k] := w between i-j line and j-k line */
  vector<vector<vector<double>>> w(
      n, vector<vector<double>>(n, vector<double>(n, 0)));

  queue<edge> q;
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      double d =
          hypot(city[i].first - city[j].first, city[i].second - city[j].second);
      dist[i][j] = dist[j][i] = d;
      if ((i == 0) && (d <= r)) {
        carrot[j][i] = 1;
        q.push(edge(j, i, d));
      }
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        if (i == j || j == k || i == k)
          continue;
        w[i][j][k] = calc_w(j, i, k, j, city);
        // cout << w[i][j][k] << endl;
      }
    }
  }

  while (!q.empty()) {
    auto p = q.front();
    q.pop();
    int now_city = p.now_city, pre_city = p.pre_city;
    double len = p.full_len;
    for (int next_city = 0; next_city < n; next_city++) {
      if (next_city == now_city || next_city == pre_city)
        continue;
      if (w[pre_city][now_city][next_city] <= theta &&
          dist[now_city][next_city] + len <= r) {
        if (carrot[next_city][now_city] < carrot[now_city][pre_city] + 1) {
          carrot[next_city][now_city] = carrot[now_city][pre_city] + 1;
          q.push(edge(next_city, now_city, dist[now_city][next_city] + len));
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      ans = max(ans, carrot[i][j]);
    }
  }
  cout << ans << endl;
}