Problem p03990 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <vector>

#define Rep(i, n) for (int i = 1; i <= n; i++)
#define Rep0(i, n) for (int i = 0; i <= n; i++)
#define RepG(i, x) for (int i = head[x]; i; i = edge[i].next)
#define v edge[i].to
#define RepG0(i, x) for (int i = head0[x]; i; i = edge0[i].next)
#define v0 edge0[i].to
#define mp(a, b) make_pair(a, b)

using namespace std;

const int N = 100010;
struct Edge {
  int to, next;
} edge[N * 2], edge0[N * 2];

int head[N], num, head0[N], num0;

void add_edge(int a, int b) { edge[++num] = (Edge){b, head[a]}, head[a] = num; }
void add_edge0(int a, int b) {
  edge0[++num0] = (Edge){b, head0[a]}, head0[a] = num0;
}

int f[N], dep[N];

void dfs(int x) {
  // printf("_%d %d\n", x, f[x]);
  RepG0(i, x) if (v0 != f[x]) {
    dep[v0] = dep[x] + 1, f[v0] = x;
    dfs(v0);
  }
}

bool jud(int x, int y) {
  return (f[x] == y || f[f[x]] == y || f[y] == x || f[f[y]] == x ||
          f[x] == f[y]);
}

bool flag;
int ans;

void dfs(int x, int fa, int dis) {
  if (dis >= dep[x])
    return;
  else
    ans = max(ans, dep[x]);
  RepG(i, x) if (v != fa) {
    if (jud(x, v))
      dfs(v, x, dis + 1);
    else {
      flag = true;
      //	printf("%d %d ???\n", x, v);
    }
  }
}

int main() {
  int n, x, y;
  scanf("%d%d%d", &n, &x, &y);
  Rep(i, n - 1) {
    int a, b;
    scanf("%d%d", &a, &b);
    add_edge(a, b);
    add_edge(b, a);
  }
  Rep(i, n - 1) {
    int a, b;
    scanf("%d%d", &a, &b);
    add_edge0(a, b);
    add_edge0(b, a);
  }
  dfs(y);
  dfs(x, 0, 0);

  if (flag)
    printf("-1\n");
  else
    printf("%d\n", ans * 2);

  return 0;
}

Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <vector>

#define Rep(i, n) for (int i = 1; i <= n; i++)
#define Rep0(i, n) for (int i = 0; i <= n; i++)
#define RepG(i, x) for (int i = head[x]; i; i = edge[i].next)
#define v edge[i].to
#define RepG0(i, x) for (int i = head0[x]; i; i = edge0[i].next)
#define v0 edge0[i].to
#define mp(a, b) make_pair(a, b)

using namespace std;

const int N = 200010;
struct Edge {
  int to, next;
} edge[N * 2], edge0[N * 2];

int head[N], num, head0[N], num0;

void add_edge(int a, int b) { edge[++num] = (Edge){b, head[a]}, head[a] = num; }
void add_edge0(int a, int b) {
  edge0[++num0] = (Edge){b, head0[a]}, head0[a] = num0;
}

int f[N], dep[N];

void dfs(int x) {
  // printf("_%d %d\n", x, f[x]);
  RepG0(i, x) if (v0 != f[x]) {
    dep[v0] = dep[x] + 1, f[v0] = x;
    dfs(v0);
  }
}

bool jud(int x, int y) {
  return (f[x] == y || f[f[x]] == y || f[y] == x || f[f[y]] == x ||
          f[x] == f[y]);
}

bool flag;
int ans;

void dfs(int x, int fa, int dis) {
  if (dis >= dep[x])
    return;
  else
    ans = max(ans, dep[x]);
  RepG(i, x) if (v != fa) {
    if (jud(x, v))
      dfs(v, x, dis + 1);
    else {
      flag = true;
      //	printf("%d %d ???\n", x, v);
    }
  }
}

int main() {
  int n, x, y;
  scanf("%d%d%d", &n, &x, &y);
  Rep(i, n - 1) {
    int a, b;
    scanf("%d%d", &a, &b);
    add_edge(a, b);
    add_edge(b, a);
  }
  Rep(i, n - 1) {
    int a, b;
    scanf("%d%d", &a, &b);
    add_edge0(a, b);
    add_edge0(b, a);
  }
  dfs(y);
  dfs(x, 0, 0);

  if (flag)
    printf("-1\n");
  else
    printf("%d\n", ans * 2);

  return 0;
}