要相邻三个点颜色不一样。
那么一个点的所有孩子都不一样,只要明白这个就好。
剩下的直接dfs,颜色直接找。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define LL long long
const int maxn = 2e5 + 10;
struct node
{
int v, nxt;
}e[maxn << 1];
int head[maxn], cnt;
int color[maxn];
void add(int u, int v)
{
e[++cnt].v = v;
e[cnt].nxt = head[u];
head[u] = cnt;
}
void dfs(int x, int fa)
{
int num = 1, v;
for (int i = head[x]; i; i = e[i].nxt)
{
v = e[i].v;
if (v == fa)continue;
while (num == color[x] || num == color[fa])num++;
color[v] = num++;
dfs(v, x);
}
}
int main()
{
int n;
scanf("%d", &n);
int u, v;
for (int i = 1; i < n; i++)
{
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
color[1] = 1;
dfs(1, 0);
int ans = 0;
for (int i = 1; i <= n; i++)ans = max(ans, color[i]);
cout << ans << endl;
for (int i = 1; i <= n; i++)printf("%d ", color[i]);
return 0;
}