CF780C Andryusha and Colored Balloons (dfs)
codeforce链接:https://codeforces.com/problemset/problem/780/C
CF780C Andryusha and Colored Balloons
题目描述
题意:
有一颗n个节点的树,进行有限制染色,问染色的最少颜色数,以及每个点的颜色(从1标号,标号不能超过颜色数).
限制:相邻三个点的颜色不能相同.
输入格式
第一行一个n,
接下来n-1行<x,y>,表示x与y之间有一条连边.
输出格式
第一行一个数,为最小颜色数.
接下来n个数,为[1,n]的点的颜色.
输入输出样例 #1
输入 #1
3
2 3
1 3
输出 #1
3
1 3 2
输入输出样例 #2
输入 #2
5
2 3
5 3
4 3
1 3
输出 #2
5
1 3 2 5 4
输入输出样例 #3
输入 #3
5
2 1
3 2
4 3
5 4
输出 #3
3
1 2 3 1 2
说明/提示
n:[3,2e5]
思路:
用dfs来处理涂色问题,标记已经遍历过的,标记颜色通过碰到相同的颜色++,保证最后使用的最大颜色数最小
题解
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int n;
vector<int>t[N];
bool vis[N];
int c[N];
int cnt;
void dfs(int pos,int pre)
{
int now=1;
vis[pos]=1;
for(int i=0;i<t[pos].size();i++)
{
if(vis[t[pos][i]])continue;
while(now==c[pre]||now==c[pos])now++;
c[t[pos][i]]=now;
cnt=max(cnt,now);
dfs(t[pos][i],pos);
now++;
}
}
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
t[u].push_back(v);
t[v].push_back(u);
}
c[1]=1;
dfs(1,0);
cout<<cnt<<endl;
for(int i=1;i<=n;i++)cout<<c[i]<<' ';
cout<<endl;
return 0;
}

浙公网安备 33010602011771号