← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

func main() {
	in := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(in, &n)
	adj := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		var x, y int
		fmt.Fscan(in, &x, &y)
		adj[x] = append(adj[x], y)
		adj[y] = append(adj[y], x)
	}
	var dfs func(int, int) (int, []int)
	dfs = func(v, p int) (int, []int) {
		var all []int
		if len(adj[v]) == 1 {
			all = append(all, 0)
		}
		var L int = len(all)
		var childLists [][]int
		for _, u := range adj[v] {
			if u == p {
				continue
			}
			_, lis := dfs(u, v)
			childLists = append(childLists, lis)
			L += len(lis)
		}
		for _, lis := range childLists {
			for _, dd := range lis {
				all = append(all, dd+1)
			}
		}
		sort.Ints(all)
		var maxT int
		for i := 0; i < L; i++ {
			cand := all[i] + L - 1 - i
			if cand > maxT {
				maxT = cand
			}
		}
		return maxT, all
	}
	var ans int
	for _, u := range adj[1] {
		ex, _ := dfs(u, 1)
		if ex+1 > ans {
			ans = ex + 1
		}
	}
	fmt.Println(ans)
}
```