从任意点出发,贪心染色即可。
#include<cstdio> #include<algorithm> using namespace std; int v[200010<<1],next[200010<<1],first[200010],e; void AddEdge(int U,int V) { v[++e]=V; next[e]=first[U]; first[U]=e; } bool vis[200010]; int n,col[200010]; void dfs(int U,int n1,int n2) { vis[U]=1; int co=0; for(int i=first[U];i;i=next[i]) if(!vis[v[i]]) { ++co; while(co==n1 || co==n2) ++co; col[v[i]]=co; dfs(v[i],col[U],col[v[i]]); } } int main() { // freopen("c.in","r",stdin); int x,y; scanf("%d",&n); for(int i=1;i<n;++i) { scanf("%d%d",&x,&y); AddEdge(x,y); AddEdge(y,x); } col[1]=1; dfs(1,1,-1); printf("%d ",*max_element(col+1,col+n+1)); for(int i=1;i<n;++i) printf("%d ",col[i]); printf("%d ",col[n]); return 0; }