换根DP
距离和
int n;
ll f[100001], v[100001], size_[100001];
bool b[100001];
vector<int>son[100001];
void up(int i) {
size_[i] = 1;
b[i] = true;
for (auto it : son[i]) {
if (!b[it]) {
up(it);
size_[i]+=size_[it];
f[i] += f[it];
}
}
f[i] += size_[i] - 1;
}
void down(int i) {
b[i] = true;
for (auto it : son[i]) {
if (!b[it]) {
v[it] = v[i] + f[i] - f[it] - size_[it] + n - size_[it];
down(it);
}
}
}
int main() {
scanf("%d", &n);
for (int i = 1; i < n; i++) {
int x, y; scanf("%d %d", &x, &y);
son[x].push_back(y);
son[y].push_back(x);
}
memset(b, false, sizeof(b));
up(1);//计算f数组
memset(b, false, sizeof(b));
down(1);//计算v数组
for (int i = 1; i <= n; i++) printf("%lld\n",v[i] + f[i]);
return 0;
}流
Last updated