import
java.util.*;
public
class
Main {
public
static
void
dfs(
int
node,
int
par,
List<Integer>[] adj,
List<Long> dp, List<Long> size)
{
size.set(node, 1L);
for
(
int
it : adj[node]) {
if
(it != par) {
dfs(it, node, adj, dp, size);
dp.set(node,
dp.get(node)
+ (dp.get(it) + size.get(it)));
size.set(node,
size.get(node) + size.get(it));
}
}
}
public
static
void
dfs2(
int
node,
int
par,
int
h,
List<Integer>[] adj,
List<Long> size, List<Long> dp,
long
[] ans)
{
long
temp = dp.get(
0
) - (h * size.get(node));
ans[
0
] = Math.min(ans[
0
], temp);
for
(
int
it : adj[node]) {
if
(it != par) {
dfs2(it, node, h +
1
, adj, size, dp, ans);
}
}
}
public
static
long
minDistance(
int
n, List<List<Integer> > edges)
{
List<Integer>[] adj =
new
List[n];
for
(
int
i =
0
; i < n; i++) {
adj[i] =
new
ArrayList<>();
}
for
(
int
i =
0
; i < n -
1
; i++) {
adj[edges.get(i).get(
0
)].add(
edges.get(i).get(
1
));
adj[edges.get(i).get(
1
)].add(
edges.get(i).get(
0
));
}
List<Long> dp
=
new
ArrayList<>(Collections.nCopies(n, 0L));
List<Long> size
=
new
ArrayList<>(Collections.nCopies(n, 0L));
dfs(
0
, -
1
, adj, dp, size);
long
[] ans = { dp.get(
0
) };
for
(
int
it : adj[
0
]) {
dfs2(it,
0
,
0
, adj, size, dp, ans);
}
return
ans[
0
];
}
public
static
void
main(String[] args)
{
int
n =
5
;
List<List<Integer> > edges =
new
ArrayList<>();
edges.add(Arrays.asList(
0
,
1
));
edges.add(Arrays.asList(
1
,
2
));
edges.add(Arrays.asList(
2
,
3
));
edges.add(Arrays.asList(
3
,
4
));
long
ans = minDistance(n, edges);
System.out.println(ans);
}
}