题意:
给你一个地图,让你涂色。连续的三个不能颜色重复,问颜色最小的数量,以及涂成的地图。
题解:
邻接表建图,然后dfs任意起点跑一边,每次传进去每个点前两个点的两个颜色值,不能相同就行。
因为我都开了 (1e5+10)*2 的空间。我觉得是够了,但是一直wa5 最后又放大一辈突然就过了。真是太菜了,。最近总是因为空间出错。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int v[maxn*4];
int head[maxn*4];
int col[maxn*2];
int n,x,y,cnt,maxc;
struct node{
int to,next;
}edge[maxn*4];
void AddEdge(int a,int b){
edge[++cnt].to=b;
edge[cnt].next=head[a];
head[a]=cnt;
}
void dfs(int a,int c1,int c2){
v[a]=1;
int coler=0;
for(int i=head[a];i;i=edge[i].next)
if(!v[edge[i].to]){
++coler;
while(coler==c1||coler==c2)
++coler;
col[edge[i].to]=coler;
dfs(edge[i].to,col[a],col[edge[i].to]);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;++i){
scanf("%d %d",&x,&y);
AddEdge(x,y);
AddEdge(y,x);
}
col[1]=1,maxc=0;
dfs(1,1,-1);
for(int i=1;i<=n;++i)
maxc=max(maxc,col[i]);
printf("%d\n",maxc);
for(int i=1;i<n;++i)
printf("%d ",col[i]);
printf("%d\n",col[n]);
return 0;
}