您的位置:首页 > 其它

CodeForces - 782 C Andryusha and Colored Balloons(搜索)

2018-02-13 19:19 435 查看
题意:给定n个点,并给出n-1条边使n个点都相连。现对点进行染色,规则如下:如果a和b之间有边,b和c之间也有边,那么a、b、c三点颜色不同。问最少准备多少种染料可以满足要求。3≤n≤2e5
思路:dfs。可以先挖出题目潜在的结论:任意子节点和父节点之间的颜色都不同,同一父节点下的子节点颜色都不同。依据结论,我们可以先进行染色再对节点遍历。
ac代码:#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

typedef long long ll;
const int maxn=2e5+5;

vector<int> E[maxn];
int n,col[maxn];
void dfs(int s,int pre){
int cnt=1;
for(auto i:E[s]){
if(i==pre) continue;
while(col[pre]==cnt||col[s]==cnt) cnt++;
col[i]=cnt++;
}
for(auto i:E[s]){
if(i!=pre) dfs(i,s);
}
}
int main(){
int u,v;
while(~scanf("%d",&n)){
mem(col,-1);
for(int i=1;i<=n;i++) E[i].clear();
for(int i=1;i<n;i++){
scanf("%d%d",&u,&v);
E[u].push_back(v);
E[v].push_back(u);
}
col[1]=1;
dfs(1,0);
int ans=0;
for(int i=1;i<=n;i++) if(col[i]>ans) ans=col[i];
printf("%d\n",ans);
for(int i=1;i<=n;i++) printf("%d%c",col[i],i==n?'\n':' ');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: