import
java.util.ArrayList;
import
java.util.List;
public
class
TreeScore {
static
int
n;
static
long
ans;
static
List<List<Integer> > adj;
static
List<Integer> siz;
static
List<Long> dp;
static
int
calcsize(
int
v,
int
p)
{
siz.set(v,
1
);
for
(
int
to : adj.get(v)) {
if
(to == p)
continue
;
siz.set(v, siz.get(v) + calcsize(to, v));
}
return
siz.get(v);
}
static
long
cumdp(
int
v,
int
p)
{
dp.set(v, siz.get(v).longValue());
for
(
int
to : adj.get(v)) {
if
(to == p)
continue
;
dp.set(v, dp.get(v) + cumdp(to, v));
}
return
dp.get(v);
}
static
void
dfs(
int
v,
int
p)
{
ans = Math.max(ans, dp.get(v));
for
(
int
to : adj.get(v)) {
if
(to == p)
continue
;
dp.set(v, dp.get(v) - dp.get(to));
dp.set(v, dp.get(v) - siz.get(to));
siz.set(v, siz.get(v) - siz.get(to));
siz.set(to, siz.get(to) + siz.get(v));
dp.set(to, dp.get(to) + siz.get(v));
dp.set(to, dp.get(to) + dp.get(v));
dfs(to, v);
dp.set(to, dp.get(to) - dp.get(v));
dp.set(to, dp.get(to) - siz.get(v));
siz.set(to, siz.get(to) - siz.get(v));
siz.set(v, siz.get(v) + siz.get(to));
dp.set(v, dp.get(v) + siz.get(to));
dp.set(v, dp.get(v) + dp.get(to));
}
}
public
static
void
main(String[] args)
{
n =
9
;
List<List<Integer> > edges =
new
ArrayList<>();
edges.add(
new
ArrayList<>(List.of(
2
,
3
)));
edges.add(
new
ArrayList<>(List.of(
1
,
2
)));
edges.add(
new
ArrayList<>(List.of(
2
,
5
)));
edges.add(
new
ArrayList<>(List.of(
2
,
6
)));
edges.add(
new
ArrayList<>(List.of(
1
,
4
)));
edges.add(
new
ArrayList<>(List.of(
4
,
9
)));
edges.add(
new
ArrayList<>(List.of(
9
,
7
)));
edges.add(
new
ArrayList<>(List.of(
9
,
8
)));
adj =
new
ArrayList<>();
for
(
int
i =
0
; i < n; ++i) {
adj.add(
new
ArrayList<>());
}
for
(
int
i =
0
; i < n -
1
; ++i) {
int
x = edges.get(i).get(
0
),
y = edges.get(i).get(
1
);
--x;
--y;
adj.get(x).add(y);
adj.get(y).add(x);
}
ans =
0
;
siz =
new
ArrayList<>(n);
dp =
new
ArrayList<>(n);
for
(
int
i =
0
; i < n; ++i) {
siz.add(
0
);
dp.add(0L);
}
calcsize(
0
, -
1
);
cumdp(
0
, -
1
);
dfs(
0
, -
1
);
System.out.println(ans);
}
}