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;
}
posted @ 2025-05-25 19:56  屈臣  阅读(22)  评论(0)    收藏  举报