52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
const int N = 2e5 + 10;
|
||
const int M = 4e5 + 10;
|
||
/*
|
||
3
|
||
1 3
|
||
2 3
|
||
|
||
答案 :
|
||
2 2 1
|
||
*/
|
||
// 链式前向星
|
||
int e[M], h[N], idx, ne[M];
|
||
void add(int a, int b) {
|
||
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
|
||
}
|
||
int cnt[2]; // 两种颜色都有多少个
|
||
int color[N]; // 当前节点颜色,也可以理解为是奇偶性
|
||
/*
|
||
u 当前节点
|
||
c 当前节点颜色 【二分图染色,也可以理解为是奇偶性】
|
||
fa 当前节点的父节点
|
||
*/
|
||
void dfs(int u, int c, int fa) {
|
||
color[u] = c; // u节点标识为c这个颜色
|
||
cnt[c]++; // 颜色计数
|
||
for (int i = h[u]; ~i; i = ne[i])
|
||
if (e[i] != fa) // 不走回头路
|
||
dfs(e[i], c ^ 1, u); // 走向下一个节点,下一个节点的颜色需要变换,同时标识父节点是u
|
||
}
|
||
|
||
int main() {
|
||
// 初始化链式前向星
|
||
memset(h, -1, sizeof h);
|
||
int n;
|
||
cin >> n;
|
||
for (int i = 1; i < n; i++) {
|
||
int a, b;
|
||
cin >> a >> b;
|
||
add(a, b);
|
||
add(b, a);
|
||
}
|
||
|
||
// 深搜一次,从1号节点搜索,标识为0这个颜色,1的父节点不存在,传入0
|
||
dfs(1, 0, 0);
|
||
|
||
// 输出结果
|
||
for (int i = 1; i <= n; i++) // 每个节点都讨论一次,其实就是按颜色分两组,每组的个数输出即可
|
||
printf("%d ", cnt[color[i]]);
|
||
return 0;
|
||
} |