#include #include #include #include #include namespace emthrm { std::pair> double_sweep( const std::vector>& graph) { const auto dfs1 = [&graph](auto dfs1, const int par, const int ver) -> std::pair { std::pair res{0, ver}; for (const int e : graph[ver]) { if (e != par) { std::pair child = dfs1(dfs1, ver, e); ++child.first; if (child.first > res.first) res = child; } } return res; }; const int s = dfs1(dfs1, -1, 0).second; const auto [diameter, t] = dfs1(dfs1, -1, s); std::vector path{s}; const auto dfs2 = [&graph, t, &path](auto dfs2, const int par, const int ver) -> bool { if (ver == t) return true; for (const int e : graph[ver]) { if (e != par) { path.emplace_back(e); if (dfs2(dfs2, ver, e)) return true; path.pop_back(); } } return false; }; assert(dfs2(dfs2, -1, s)); return {diameter, path}; } } // namespace emthrm // 【テストケースのチェック】 // 木の直径を標準エラー出力に出力する。 int main() { constexpr int kMaxT = 100000, kMaxN = 40000; int t; std::cin >> t; assert(1 <= t && t <= kMaxT); while (t--) { int n; std::cin >> n; assert(2 <= n && n <= kMaxN); std::vector> tree(n); for (int i = 0; i < n - 1; ++i) { int u, v; std::cin >> u >> v; assert(1 <= u && u <= n && 1 <= v && v <= n); --u; --v; tree[u].emplace_back(v); tree[v].emplace_back(u); } std::cerr << emthrm::double_sweep(tree).second.size() << '\n'; } return 0; }