← Home
```go
package main

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

var adj [][]int
var sz []int
var subSum []int64
var ans []int64

func dfs1(u, p int) {
	sz[u] = 1
	subSum[u] = 0
	for _, v := range adj[u] {
		if v != p {
			dfs1(v, u)
			sz[u] += sz[v]
			subSum[u] += subSum[v] + int64(sz[v])
		}
	}
}

func dfs2(u, p int, n int) {
	for _, v := range adj[u] {
		if v != p {
			ans[v] = ans[u] + int64(n) - 2*int64(sz[v])
			dfs2(v, u, n)
		}
	}
}

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 u, v int
		fmt.Fscan(in, &u, &v)
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}
	sz = make([]int, n+1)
	subSum = make([]int64, n+1)
	dfs1(1, -1)
	ans = make([]int64, n+1)
	ans[1] = subSum[1]
	dfs2(1, -1, n)
	maxScore := int64(0)
	for i := 1; i <= n; i++ {
		score := int64(n) + ans[i]
		if score > maxScore {
			maxScore = score
		}
	}
	fmt.Println(maxScore)
}
```