Problem p03990 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int N = 200005;
struct qq {
  int x, y, last;
} e[N];
int num, last[N];
int X[N], Y[N];
void init(int x, int y) {
  num++;
  e[num].x = x;
  e[num].y = y;
  e[num].last = last[x];
  last[x] = num;
}
int n, xx, yy;
int L[N], R[N], dep[N], fa[N];
void dfs(int x) {
  L[x] = ++num;
  for (int u = last[x]; u != -1; u = e[u].last) {
    int y = e[u].y;
    if (y == fa[x])
      continue;
    fa[y] = x;
    dep[y] = dep[x] + 1;
    dfs(y);
  }
  R[x] = num;
}
bool ok[N];
vector<int> vec[N];
bool vis[N];
int d[N];
void bfs() {
  memset(d, 127, sizeof(d));
  memset(vis, false, sizeof(vis));
  vis[xx] = true;
  d[xx] = 0;
  queue<int> q;
  q.push(xx);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    //	printf("%d\n",x);
    int siz = vec[x].size();
    for (int i = 0; i < siz; i++) {
      int y = vec[x][i];
      if (vis[y])
        continue;
      if (d[y] > d[x] + 1) {
        d[y] = d[x] + 1;
        if (d[y] < dep[y]) {
          vis[y] = true;
          q.push(y);
        }
      }
    }
  }
}
bool check(int x, int y) // 这两个点是否可以由同一个点到达
{
  if (dep[x] > dep[y])
    swap(x, y);
  if (L[x] <= L[y] && L[y] <= R[x]) // 在他子树里面
    return dep[y] - dep[x] > 2;
  if (fa[x] == fa[y])
    return false;
  return true;
}
int main() {
  num = 0;
  memset(last, -1, sizeof(last));
  scanf("%d%d%d", &n, &xx, &yy);
  for (int u = 1; u < n; u++)
    scanf("%d%d", &X[u], &Y[u]);
  for (int u = 1; u < n; u++) {
    int x, y;
    scanf("%d%d", &x, &y);
    init(x, y);
    init(y, x);
  }
  num = 0;
  dfs(yy);
  /*for (int u=1;u<=n;u++) printf("%d ",dep[u]);
  printf("\n");*/
  memset(ok, false, sizeof(ok));
  for (int u = 1; u < n; u++) {
    if (check(X[u], Y[u])) {
      ok[X[u]] = true;
      ok[Y[u]] = true;
    } else
      vec[X[u]].push_back(Y[u]), vec[Y[u]].push_back(X[u]);
  }
  bfs();
  int ans = 0;
  for (int u = 1; u <= n; u++) {
    if (ok[u] && vis[u]) {
      printf("-1\n");
      return 0;
    }
    if (vis[u])
      ans = max(ans, dep[u] * 2);
  }
  printf("%d\n", ans);
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int N = 200005;
struct qq {
  int x, y, last;
} e[N * 2];
int num, last[N];
int X[N], Y[N];
void init(int x, int y) {
  num++;
  e[num].x = x;
  e[num].y = y;
  e[num].last = last[x];
  last[x] = num;
}
int n, xx, yy;
int L[N], R[N], dep[N], fa[N];
void dfs(int x) {
  L[x] = ++num;
  for (int u = last[x]; u != -1; u = e[u].last) {
    int y = e[u].y;
    if (y == fa[x])
      continue;
    fa[y] = x;
    dep[y] = dep[x] + 1;
    dfs(y);
  }
  R[x] = num;
}
bool ok[N];
vector<int> vec[N];
bool vis[N];
int d[N];
void bfs() {
  memset(d, 127, sizeof(d));
  memset(vis, false, sizeof(vis));
  vis[xx] = true;
  d[xx] = 0;
  queue<int> q;
  q.push(xx);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    //	printf("%d\n",x);
    int siz = vec[x].size();
    for (int i = 0; i < siz; i++) {
      int y = vec[x][i];
      if (vis[y])
        continue;
      if (d[y] > d[x] + 1) {
        d[y] = d[x] + 1;
        if (d[y] < dep[y]) {
          vis[y] = true;
          q.push(y);
        }
      }
    }
  }
}
bool check(int x, int y) // 这两个点是否可以由同一个点到达
{
  if (dep[x] > dep[y])
    swap(x, y);
  if (L[x] <= L[y] && L[y] <= R[x]) // 在他子树里面
    return dep[y] - dep[x] > 2;
  if (fa[x] == fa[y])
    return false;
  return true;
}
int main() {
  num = 0;
  memset(last, -1, sizeof(last));
  scanf("%d%d%d", &n, &xx, &yy);
  for (int u = 1; u < n; u++)
    scanf("%d%d", &X[u], &Y[u]);
  for (int u = 1; u < n; u++) {
    int x, y;
    scanf("%d%d", &x, &y);
    init(x, y);
    init(y, x);
  }
  num = 0;
  dfs(yy);
  /*for (int u=1;u<=n;u++) printf("%d ",dep[u]);
  printf("\n");*/
  memset(ok, false, sizeof(ok));
  for (int u = 1; u < n; u++) {
    if (check(X[u], Y[u])) {
      ok[X[u]] = true;
      ok[Y[u]] = true;
    } else
      vec[X[u]].push_back(Y[u]), vec[Y[u]].push_back(X[u]);
  }
  bfs();
  int ans = 0;
  for (int u = 1; u <= n; u++) {
    if (ok[u] && vis[u]) {
      printf("-1\n");
      return 0;
    }
    if (vis[u])
      ans = max(ans, dep[u] * 2);
  }
  printf("%d\n", ans);
  return 0;
}