蓝桥圣诞树(C++)

问题描述
输入样例:

1 3

101

1 2

2 3

输出样例:

YES

思路:

这道题还是比较好想的,因为它构造的二叉树是用边连接起来的,不是像之前一样从上到下从左到右按编号构造的,所以可以用邻接表来存每个点还有边,这样可以很方便的找到每个点的相邻点,然后再判断每个点是否有两个相邻点和它颜色一样(即三个连续点同色),这样就可以判断不美观的圣诞树了。

示例代码:
cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1010;
int h[N], e[N], ne[N], idx;
char color[N];
void add(int a, int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        idx=0; //对于每个样例,都需要重置idx为0,不然上一个样例创建的邻接表就会影响下一个样例
        int n;
        cin >> n;
        memset(h, -1, sizeof(h)); //邻接表初始化

        for (int i = 1; i <= n; i++)
        {
            cin >> color[i];
        }
        for (int i = 0; i < n - 1; i++)
        {
            int a, b;
            cin >> a >> b;
            add(a, b);
            add(b, a);
        }
        //遍历每个点,如果它有两个邻点颜色和它本身都一样就不行
        int flag = 0;
        for (int i = 1; i <= n; i++) //遍历所有点
        {
            int res = 0;
            for (int j = h[i]; j != -1; j = ne[j]) //找每个点的邻点
            {
                int k = e[j]; //邻点的编号
                if (color[i] == color[k]) res++; //每次找到一个邻点颜色和当前点一样就计数加一
                if (res > 1) //有两个邻点和当前点的颜色一样,说明有三个连续点是同色,即不美观
                {
                    flag = 1;
                }
            }
            if (flag) break; //找到了一组连续三个点是同色,就可以退出了
        }
        if (flag) cout << "NO" << endl;
        else cout << "YES" << endl;
    }

    return 0;
}
注意:

每次进入新样例都要重置idx为0构造新的邻接表,不然会被上一个样例影响!!!

cpp 复制代码
while (t--)
    {
        idx=0; //对于每个样例,都需要重置idx为0,不然上一个样例创建的邻接表就会影响下一个样例
        int n;
        cin >> n;
        memset(h, -1, sizeof(h)); //邻接表初始化
    }

然后我的几个错误,输入n-1行写成了

cpp 复制代码
while(n-1)
相关推荐
CoovallyAIHub1 小时前
181小时视频丢给GPT-5,准确率只有15%——南大联合NVIDIA等五校发布多模态终身理解数据集
深度学习·算法·计算机视觉
CoovallyAIHub1 小时前
CVPR 2026 | GS-CLIP:3D几何先验+双流视觉融合,零样本工业缺陷检测新SOTA,四大3D工业数据集全面领先!
深度学习·算法·计算机视觉
xlp666hub2 小时前
Leetcode 第三题:用C++解决最长连续序列
c++·leetcode
会员源码网3 小时前
构造函数抛出异常:C++对象部分初始化的陷阱与应对策略
c++
有意义4 小时前
深度拆解分割等和子集:一维DP数组与倒序遍历的本质
前端·算法·面试
xlp666hub5 小时前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode
用户726876103375 小时前
解放双手的健身助手:基于 Rokid AR 眼镜的运动计时应用
算法
Wect5 小时前
LeetCode 17. 电话号码的字母组合:回溯算法入门实战
前端·算法·typescript
不想写代码的星星6 小时前
static 关键字:从 C 到 C++,一篇文章彻底搞懂它的“七十二变”
c++
xlp666hub1 天前
Leetcode第一题:用C++解决两数之和问题
c++·leetcode