Problem p03384 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>

using namespace std;

template <typename T> struct edge {
  int src, to;
  T cost;

  edge(int to, T cost) : src(-1), to(to), cost(cost) {}

  edge(int src, int to, T cost) : src(src), to(to), cost(cost) {}

  edge &operator=(const int &x) {
    to = x;
    return *this;
  }

  operator int() const { return to; }
};

template <typename T> using Edges = vector<edge<T>>;
template <typename T> using WeightedGraph = vector<Edges<T>>;
using UnWeightedGraph = vector<vector<int>>;
template <typename T> using Matrix = vector<vector<T>>;

template <typename T>
pair<T, int> dfs(const WeightedGraph<T> &g, int idx, int par) {
  pair<T, int> ret(0, idx);
  for (auto &e : g[idx]) {
    if (e.to == par)
      continue;
    auto cost = dfs(g, e.to, idx);
    cost.first += e.cost;
    ret = max(ret, cost);
  }
  return ret;
}

template <typename T> pair<int, int> tree_diameter(const WeightedGraph<T> &g) {
  auto p = dfs(g, 0, -1);
  auto q = dfs(g, p.second, -1);
  return {p.second, q.second};
}

vector<int> vv;
int ptr;

void dfs2(WeightedGraph<int> g, int s, int t, int par = -1) {
  int space = 0, link = -1;
  for (auto &to : g[s]) {
    if (to == par)
      continue;
    if (g[to].size() == 1 && to != t)
      ++space;
    else
      link = to;
  }
  for (int i = 0; i < space; i++) {
    vv[ptr + i] = ptr + i + 1;
  }
  ptr += space;
  vv[ptr] = ptr - space;
  ++ptr;
  if (~link)
    dfs2(g, link, t, s);
}

int main() {
  int N;
  cin >> N;
  WeightedGraph<int> g(N);
  for (int i = 1; i < N; i++) {
    int x, y;
    cin >> x >> y;
    --x, --y;
    g[x].emplace_back(y, 1);
    g[y].emplace_back(x, 1);
  }
  auto pp = tree_diameter(g);
  vv.resize(N);
  ptr = 0;
  dfs2(g, pp.first, pp.second);
  if (ptr < N) {
    cout << -1 << endl;
    return 0;
  }
  auto latte = vv;
  ptr = 0;
  dfs2(g, pp.second, pp.first);
  auto malta = vv;
  if (latte > malta)
    swap(latte, malta);
  for (auto &p : latte)
    cout << p + 1 << " ";
  cout << endl;
}


Fixed submission:
#include <bits/stdc++.h>

using namespace std;

template <typename T> struct edge {
  int src, to;
  T cost;

  edge(int to, T cost) : src(-1), to(to), cost(cost) {}

  edge(int src, int to, T cost) : src(src), to(to), cost(cost) {}

  edge &operator=(const int &x) {
    to = x;
    return *this;
  }

  operator int() const { return to; }
};

template <typename T> using Edges = vector<edge<T>>;
template <typename T> using WeightedGraph = vector<Edges<T>>;
using UnWeightedGraph = vector<vector<int>>;
template <typename T> using Matrix = vector<vector<T>>;

template <typename T>
pair<T, int> dfs(const WeightedGraph<T> &g, int idx, int par) {
  pair<T, int> ret(0, idx);
  for (auto &e : g[idx]) {
    if (e.to == par)
      continue;
    auto cost = dfs(g, e.to, idx);
    cost.first += e.cost;
    ret = max(ret, cost);
  }
  return ret;
}

template <typename T> pair<int, int> tree_diameter(const WeightedGraph<T> &g) {
  auto p = dfs(g, 0, -1);
  auto q = dfs(g, p.second, -1);
  return {p.second, q.second};
}

vector<int> vv;
int ptr;

void dfs2(WeightedGraph<int> &g, int s, int t, int par = -1) {
  int space = 0, link = -1;
  for (auto &to : g[s]) {
    if (to == par)
      continue;
    if (g[to].size() == 1 && to != t)
      ++space;
    else
      link = to;
  }
  for (int i = 0; i < space; i++) {
    vv[ptr + i] = ptr + i + 1;
  }
  ptr += space;
  vv[ptr] = ptr - space;
  ++ptr;
  if (~link)
    dfs2(g, link, t, s);
}

int main() {
  int N;
  cin >> N;
  WeightedGraph<int> g(N);
  for (int i = 1; i < N; i++) {
    int x, y;
    cin >> x >> y;
    --x, --y;
    g[x].emplace_back(y, 1);
    g[y].emplace_back(x, 1);
  }
  auto pp = tree_diameter(g);
  vv.resize(N);
  ptr = 0;
  dfs2(g, pp.first, pp.second);
  if (ptr < N) {
    cout << -1 << endl;
    return 0;
  }
  auto latte = vv;
  ptr = 0;
  dfs2(g, pp.second, pp.first);
  auto malta = vv;
  if (latte > malta)
    swap(latte, malta);
  for (auto &p : latte)
    cout << p + 1 << " ";
  cout << endl;
}