Codeforces Round #403 div2 C. Andryusha and Colored Balloons

本文解析了Codeforces Round #403 (Div. 2) C题——Andryusha and Colored Balloons。题目要求给一棵树的节点染色,使得任意三个相邻节点的颜色都不相同,且使用最少的颜色数。通过深度优先搜索(DFS)策略,实现了有效的染色算法并给出了具体实现代码。

题目链接:Codeforces Round #403 div2 C. Andryusha and Colored Balloons

题意:

给你一棵n个节点的树,然后让你染色,规定相连的三个 节点不能同色,问需要的最少颜色,并输出其中一种方案。

题解:

因为只有相邻3个节点不同色。

所以直接DFS,每个节点都从1开始。

然后ans[v]!=ans[u]!=ans[fa]就行。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 const int N=2e5+7;
 6 int n,g[N],v[N*2],nxt[N*2],ed,cnt,ans[N];
 7 void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}
 8 
 9 void dfs(int x,int fa)
10 {
11     int cnt=1;
12     for(int i=g[x];i;i=nxt[i])if(v[i]!=fa)
13     {
14         while(cnt==ans[fa]||cnt==ans[x])cnt++;
15         ans[v[i]]=cnt,cnt++;
16     }
17     for(int i=g[x];i;i=nxt[i])if(v[i]!=fa)
18     {
19         dfs(v[i],x);
20     }
21 }
22 
23 int main(){
24     scanf("%d",&n);
25     int x,y;
26     F(i,1,n-1)
27     {
28         scanf("%d%d",&x,&y);
29         adg(x,y),adg(y,x);
30     }
31     ans[1]=1;
32     dfs(1,0);
33     int an=0;
34     F(i,1,n)an=max(an,ans[i]);
35     printf("%d\n",an);
36     F(i,1,n)printf("%d%c",ans[i]," \n"[i==n]);
37     return 0;
38 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/6509485.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值