2023年第十四届蓝桥杯C/C++ A组 E题 颜色平衡树

试题 E:颜色平衡树

要判断每个子树是否为颜色平衡树,需要统计子树各种颜色的节点数量,并判断所有数量是否相等

对于一棵树的根节点,如果它所有子树的统计结果都得到了,可以将所有子树的统计结果累加并算上根节点的颜色,这样就可以判断是否为颜色平衡树。

因此,我们可以使用深度优先搜索,将后序遍历得到的子树统计结果累加,然后判断颜色是否相等。

考虑访问的便捷性,我们采用 map 存储各个颜色对应的数量。

#include <iostream>
#include <vector>
#include <map>

using namespace std;

int ans = 0; // 最终结果

/**
 * 将子树的颜色数量表添加到根的颜色数量表
 *
 * @param cnt 根的颜色数量表
 * @param cnt_nb 子树的颜色数量表
 */
void add(map<int, int> &cnt, map<int, int> &cnt_nb) {
    for (auto entry: cnt_nb) {
        int color = entry.first;
        int count = entry.second;
        cnt[color] += count;
    }
}

/**
 * 深度优先遍历
 *
 * @param children 孩子数组
 * @param colors 颜色数组
 * @param root 根节点下标
 * @return 以root为根节点的树的各个颜色个数
 */
map<int, int> dfs(vector<vector<int>> &children, vector<int> &colors, int root) {
    int size = children[root].size();
    map<int, int> cnt; // 记录以root为根的树中所有节点的颜色数量
    if (size == 0) {
        cnt[colors[root]] = 1;
        ans++;
        return cnt;
    }
    cnt[colors[root]] = 1;
    // 对每个孩子节点进行遍历
    for (int i = 0; i < size; i++) {
        // 递归寻找每个子树的颜色数量表
        map<int, int> cnt_nb = dfs(children, colors, children[root][i]);
        // 合并
        add(cnt, cnt_nb);
    }
    // 判断是否满足颜色平衡
    int count = cnt[colors[root]];
    for (auto entry: cnt) {
        if (entry.second != count) return cnt;
    }
    ans++;
    return cnt;
}

int main() {
    int n;
    cin >> n;
    vector<int> colors(n); // 颜色数组
    vector<vector<int>> children(n); // 孩子数组
    for (int i = 0; i < n; ++i) {
        int fa;
        cin >> colors[i] >> fa;
        // 节点i是节点fa的孩子
        if (fa > 0) {
            children[fa - 1].push_back(i);
        }
    }
    dfs(children, colors, 0);
    cout << ans << endl;
    return 0;
}
2023第十四届蓝桥杯 C/C++ 大学生大赛 A 省赛是一个非常重要且具有挑战性的比赛。作为蓝桥杯系列赛事的一部分,这个比赛吸引了全国各地的大学生参与,旨在促进青学生计算机编程技术的提高,培养他们的创新能力和团队协作精神。 参赛者需要通过线上报名,在规定的时间内上传自己的比赛作品。比赛设置了一系列难度逐渐增加的编程目,要求选手运用C/C++语言进行编写和实现。这些目可能涉及算法设计、数据结构、编程基础等方面的知识,考察参赛者的编码能力、解决问的能力以及在压力下的应变能力。 在比赛中,选手不仅需要具备扎实的编程技术,还需要在有限的时间内迅速分析问、设计解决方案,并通过编程实现。因此,参赛者需要具备良好的逻辑思维能力、数学基础和编程实践经验。 在省赛中取得好成绩的选手将有机会晋级到全国赛,进一步与全国各地的顶尖选手一较高下,争夺更好的名次和更多的奖品。 参加蓝桥杯 C/C++ 大学生大赛不仅是一次锻炼和展示自己编程能力的机会,还能结识更多志同道合的同学和业界精英,获得丰厚的奖金和荣誉。同时,参赛经历对于大学生未来的学习和职业发展也具有积极的影响。 总之,2023第十四届蓝桥杯 C/C++ 大学生大赛 A 省赛是一个具有挑战性的比赛,参赛者需要具备扎实的编程技术和解决问的能力。通过参与比赛,学生可以提升自己的编程能力,拓宽视野,展示个人才华,并为未来的学习和就业打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值