Problem p03384 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <string.h>
#define maxn 100005
using namespace std;
int n, r, res = -1, tot, len, flag;
int head[maxn], nex[maxn], to[maxn];
int q[maxn], pa[maxn], dep[maxn], vis[maxn];
void add(int x, int y) {
  to[++tot] = y;
  nex[tot] = head[x];
  head[x] = tot;
}
void dfs(int now, int fa) {
  if (dep[now] > res) {
    res = dep[now];
    r = now;
  }

  for (int i = head[now]; i; i = nex[i]) {
    if (to[i] != fa) {
      if (flag)
        pa[to[i]] = now;
      dep[to[i]] = dep[now] + 1;
      dfs(to[i], now);
    }
  }
}
int ans1[maxn], ans2[maxn];
int solve(int *a) {
  int sz = 0;
  for (int i = 1; i <= tot; i++) {
    int now = q[i], temp = 0;
    for (int j = head[now]; j; j = nex[j])
      if (!vis[to[j]])
        temp++;
    int s = sz;
    for (int j = 1; j <= temp; j++) {
      a[++sz] = s + j + 1;
    }
    a[++sz] = s + 1;
  }
  return sz;
}
int judge() {
  for (int i = 1; i <= n; i++) {
    if (ans1[i] < ans2[i])
      return true;
    if (ans1[i] > ans2[i])
      return false;
  }
  return true;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add(x, y);
    add(y, x);
  }

  dfs(1, -1);
  res = -1;
  dep[r] = 0;
  flag = 1;
  dfs(r, -1);

  //	cerr<<r<<endl;

  tot = 0;

  while (r != 0) {
    q[++tot] = r;
    vis[r] = 1;
    r = pa[r];
  }

  if (solve(ans1) < n) {
    printf("-1\n");
    return 0;
  }

  for (int i = 1; i <= tot / 2; i++)
    swap(q[i], q[tot - i + 1]);

  solve(ans2);

  if (judge()) {
    for (int i = 1; i <= n; i++)
      printf("%d ", ans1[i]);
  } else {
    for (int i = 1; i <= n; i++)
      printf("%d ", ans2[i]);
  }
  printf("\n");
}


Fixed submission:
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <string.h>
#define maxn 200005
using namespace std;
int n, r, res = -1, tot, len, flag;
int head[maxn], nex[maxn], to[maxn];
int q[maxn], pa[maxn], dep[maxn], vis[maxn];
void add(int x, int y) {
  to[++tot] = y;
  nex[tot] = head[x];
  head[x] = tot;
}
void dfs(int now, int fa) {
  if (dep[now] > res) {
    res = dep[now];
    r = now;
  }

  for (int i = head[now]; i; i = nex[i]) {
    if (to[i] != fa) {
      if (flag)
        pa[to[i]] = now;
      dep[to[i]] = dep[now] + 1;
      dfs(to[i], now);
    }
  }
}
int ans1[maxn], ans2[maxn];
int solve(int *a) {
  int sz = 0;
  for (int i = 1; i <= tot; i++) {
    int now = q[i], temp = 0;
    for (int j = head[now]; j; j = nex[j])
      if (!vis[to[j]])
        temp++;
    int s = sz;
    for (int j = 1; j <= temp; j++) {
      a[++sz] = s + j + 1;
    }
    a[++sz] = s + 1;
  }
  return sz;
}
int judge() {
  for (int i = 1; i <= n; i++) {
    if (ans1[i] < ans2[i])
      return true;
    if (ans1[i] > ans2[i])
      return false;
  }
  return true;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add(x, y);
    add(y, x);
  }

  dfs(1, -1);
  res = -1;
  dep[r] = 0;
  flag = 1;
  dfs(r, -1);

  //	cerr<<r<<endl;

  tot = 0;

  while (r != 0) {
    q[++tot] = r;
    vis[r] = 1;
    r = pa[r];
  }

  if (solve(ans1) < n) {
    printf("-1\n");
    return 0;
  }

  for (int i = 1; i <= tot / 2; i++)
    swap(q[i], q[tot - i + 1]);

  solve(ans2);

  if (judge()) {
    for (int i = 1; i <= n; i++)
      printf("%d ", ans1[i]);
  } else {
    for (int i = 1; i <= n; i++)
      printf("%d ", ans2[i]);
  }
  printf("\n");
}