C题.[Codeforces 782C] Andryusha and Colored Balloons
题目链接
思路: 给一棵树,
a
−
b
−
c
a-b-c
a−b−c 相连的三个节点颜色互不相同,所以我们选一个节点作为根,那么对于节点
i
i
i只需要保证:
①节点
i
i
i和它的兄弟不同色
②节点
i
i
i和它的父亲不同色
③节点
i
i
i和它的祖父(父亲的父亲)不同色
所以具体过程可以用dfs来实现,传递参数父亲节点号、祖父节点号、当前使用到的颜色计数器(这个值用引用传递比较方便)。每次开始向下遍历一个节点的所有儿子时,让这个颜色计数器从
1
1
1开始并每次递增,其中,若与父亲或者祖父颜色相同,就再往后选下一个颜色。同时更新使用的最大颜色编号。
//AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int fa[N],n,k=2,color[N];
vector<int>son[N];
void dfs(int now,int fa,int gra,int &c){
while(c==color[fa]||c==color[gra])c++;
color[now]=c;
k=max(k,color[now]);
if(son[now].size()==1&&now!=1)return;
int cnt=0;
for(auto i:son[now])
if(i!=fa){
cnt++;
dfs(i,now,fa,cnt);
}
}
int main(){
cin>>n;
for(int i=1,u,v;i<n;i++){
scanf("%d%d",&u,&v);
son[u].push_back(v);
son[v].push_back(u);
}
int cnt=1;
dfs(1,0,0,cnt);
printf("%d\n",k);
for(int i=1;i<=n;i++)printf("%d ",color[i]);
}