Problem p02834 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
using vvi = vector<vector<int>>;
#define repex(i, a, b, c) for (int i = a; i < b; i += c)
#define repx(i, a, b) repex(i, a, b, 1)
#define rep(i, n) repx(i, 0, n)
#define pb push_back
int du[101010], dv[101010], duv[101010]; // 距離を保存

// グラフを幅優先探索する.
// https://ja.wikipedia.org/wiki/幅優先探索
// ※bfsの動作確認用.
// @param G: グラフ.
// @param s: グラフの探索開始頂点.
// @param d: 探索開始地点からの距離.
// @return: 特に無し.
void bfs(vvi &G, int s, int *d) {

  // 1. 空のキュー.
  queue<int> q;

  // 2. 訪問済みフラグ設定.
  // ※スタート地点は, 距離ゼロを指定.
  d[s] = 0;

  // 3. 探索地点 s をキュー q に追加.
  q.push(s);
  while (!q.empty()) {

    // 4. キューから取り出す.
    int u = q.front();
    q.pop();

    // 5. 取り出した要素を処理.
    for (auto &e : G[u]) {

      // 6. 訪問済であれば, 処理をスキップ.
      if (d[e] > 0)
        continue;
      if (d[e] == 0 && e != s)
        d[e] = d[u] + 1, q.push(e);
    }
  }
  return;
}

int main() {

  // 1. 入力情報.
  int N, u, v;
  scanf("%d %d %d", &N, &u, &v);
  u--, v--;
  vvi G(N);
  rep(i, N - 1) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--, b--;
    G[a].pb(b);
    G[b].pb(a);
  }

  // 2. 頂点 u, v から 各頂点までの距離を計算.
  bfs(G, u, du);
  bfs(G, v, dv);
  // rep(i, N) printf("%d ", du[i]);
  // puts("");
  // rep(i, N) printf("%d ", dv[i]);
  // puts("");

  // 3. 頂点 u, v の 中間地点 m を 取得.
  int m = -1, dm = du[v] / 2;
  rep(i, N) {
    if (du[i] == dm && dv[i] == dm) {
      m = i;
      break;
    }
  }

  // 4. 頂点 m から 各頂点までの距離を計算.
  bfs(G, m, duv);
  // rep(i, N) printf("%d ", duv[i]);
  // printf("\nm=%d\n", m);

  // 5. 頂点 m から 最も遠い頂点 f を 取得.
  // ※ 但し, 頂点 v よりも 頂点 u に近いものに限定.
  int f = -1, df = 0;
  rep(i, N) {
    if (df < duv[i] && du[i] < dv[i])
      f = i, df = max(df, duv[i]);
  }

  // 6. 出力.
  printf("%d\n", duv[v] + duv[f] - 1);
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
using vvi = vector<vector<int>>;
#define repex(i, a, b, c) for (int i = a; i < b; i += c)
#define repx(i, a, b) repex(i, a, b, 1)
#define rep(i, n) repx(i, 0, n)
#define pb push_back
int du[101010], dv[101010], duv[101010]; // 距離を保存

// グラフを幅優先探索する.
// https://ja.wikipedia.org/wiki/幅優先探索
// ※bfsの動作確認用.
// @param G: グラフ.
// @param s: グラフの探索開始頂点.
// @param d: 探索開始地点からの距離.
// @return: 特に無し.
void bfs(vvi &G, int s, int *d) {

  // 1. 空のキュー.
  queue<int> q;

  // 2. 訪問済みフラグ設定.
  // ※スタート地点は, 距離ゼロを指定.
  d[s] = 0;

  // 3. 探索地点 s をキュー q に追加.
  q.push(s);
  while (!q.empty()) {

    // 4. キューから取り出す.
    int u = q.front();
    q.pop();

    // 5. 取り出した要素を処理.
    for (auto &e : G[u]) {

      // 6. 訪問済であれば, 処理をスキップ.
      if (d[e] > 0)
        continue;
      if (d[e] == 0 && e != s)
        d[e] = d[u] + 1, q.push(e);
    }
  }
  return;
}

int main() {

  // 1. 入力情報.
  int N, u, v;
  scanf("%d %d %d", &N, &u, &v);
  u--, v--;
  vvi G(N);
  rep(i, N - 1) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--, b--;
    G[a].pb(b);
    G[b].pb(a);
  }

  // 2. 頂点 u, v から 各頂点までの距離を計算.
  bfs(G, u, du);
  bfs(G, v, dv);
  // rep(i, N) printf("%d ", du[i]);
  // puts("");
  // rep(i, N) printf("%d ", dv[i]);
  // puts("");

  // 3. 頂点 u, v の 中間地点 m を 取得.
  int m = -1, dm = du[v] / 2;
  rep(i, N) {
    if (du[v] % 2 == 0) {
      if (du[i] == dm && dv[i] == dm) {
        m = i;
        break;
      }
    } else {
      if (du[i] == dm && dv[i] == dm + 1) {
        m = i;
        break;
      }
    }
  }

  // 4. 頂点 m から 各頂点までの距離を計算.
  bfs(G, m, duv);
  // rep(i, N) printf("%d ", duv[i]);
  // printf("\nm=%d\n", m);

  // 5. 頂点 m から 最も遠い頂点 f を 取得.
  // ※ 但し, 頂点 v よりも 頂点 u に近いものに限定.
  int f = -1, df = 0;
  rep(i, N) {
    if (df < duv[i] && du[i] < dv[i])
      f = i, df = max(df, duv[i]);
  }

  // 6. 出力.
  printf("%d\n", duv[v] + duv[f] - 1);
  return 0;
}