#include <bits/stdc++.h>
using
namespace
std;
void
dfs0(
int
node,
int
par,
vector<vector<
int
> >& g,
vector<
int
>& dp, vector<
int
>& size)
{
dp[node] = 0;
size[node] = 1;
for
(
auto
nebr : g[node]) {
if
(par != nebr) {
dfs0(nebr, node, g, dp, size);
size[node] += size[nebr];
dp[node] += size[nebr] +
dp[nebr];
}
}
}
void
reroot(
int
from,
int
to,
vector<
int
>& dp,
vector<
int
>& size)
{
dp[from] -= size[to] + dp[to];
size[from] -= size[to];
size[to] += size[from];
dp[to] += size[from] + dp[from];
}
void
dfs1(
int
node,
int
par,
vector<vector<
int
> >& g,
vector<
int
>& dp, vector<
int
>& ans,
vector<
int
>& size)
{
ans[node] = dp[node];
for
(
auto
nebr : g[node]) {
if
(par != nebr) {
reroot(node, nebr, dp, size);
dfs1(nebr, node, g, dp, ans,
size);
reroot(nebr, node, dp, size);
}
}
}
void
edge(
int
a,
int
b,
vector<vector<
int
> >& g)
{
a--;
b--;
g[a].push_back(b);
g[b].push_back(a);
}
vector<
int
> pathSum(vector<vector<
int
> > &g,
int
N)
{
vector<
int
> dp(N), ans(N), size(N);
dfs0(0, -1, g, dp, size);
dfs1(0, -1, g, dp, ans, size);
return
ans;
}
int
main()
{
int
N = 7;
vector<vector<
int
> > g(N);
edge(1, 2, g);
edge(1, 3, g);
edge(2, 4, g);
edge(2, 5, g);
edge(5, 6, g);
edge(5, 7, g);
vector<
int
> res = pathSum(g, N);
for
(
int
i = 0; i < N; ++i) {
cout << res[i] <<
" "
;
}
cout << endl;
return
0;
}