当前位置: 首页 > news >正文

GESP2024年9月认证C++七级( 第三部分编程题(1)小杨寻宝)

参考程序:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
vector<int> g[N];  // 图的邻接表
int col[N], dep[N], has[N];

// 深度优先遍历,计算每个节点的深度
void dfs(int x, int fa) {
    dep[x] = dep[fa] + 1;  // 计算当前节点的深度
    for (auto i : g[x]) {  // 遍历与x相邻的节点
        if (i != fa) {
            dfs(i, x);  // 递归调用
        }
    }
}

// 判断从某个节点开始是否能够收集所有宝物
bool dfs2(int x, int fa) {
    for (auto i : g[x]) {
        if (i != fa) {
            auto res = dfs2(i, x);  // 递归判断子树
            if (res == false) return false;  // 如果有子树不能满足条件,返回false
            if (has[i] || col[i]) has[x]++;  // 如果子树或者该节点放有宝物,则当前节点记录已收集的宝物数量
        }
    }
    if (has[x] > 1) return false;  // 如果某节点收集到两个宝物,说明不能收集所有宝物
    return true;
}

int main() {
    int t;
    cin >> t;  // 输入测试用例数
    while (t--) {
        int n;
        cin >> n;  // 输入节点数
        for (int i = 1; i <= n; i++) {
            dep[i] = 0;
            g[i].clear();
            cin >> col[i];  // 输入每个节点是否有宝物
        }
        
        // 输入树的边
        for (int i = 1; i < n; i++) {
            int u, v;
            cin >> u >> v;
            g[u].push_back(v);
            g[v].push_back(u);
        }
        
        // 从节点1开始进行深度优先搜索,计算每个节点的深度
        dfs(1, 0);
        
        // 找到放置宝物的最远节点
        int mx = 0, pos = 0;
        for (int i = 1; i <= n; i++) {
            has[i] = 0;  // 初始化has数组
            if (col[i] && dep[i] > mx) {
                mx = dep[i];  // 更新最远的放置宝物的节点
                pos = i;  // 记录最远的宝物节点
            }
        }
        
        // 从最远的宝物节点出发,进行第二次深度优先搜索
        bool res = dfs2(pos, 0);
        if (res) {
            cout << "Yes\n";  // 如果能收集所有宝物,输出Yes
        } else {
            cout << "No\n";  // 否则输出No
        }
    }
}

相关文章:

  • 【SpringBoot3.x+】slf4j-log4j12依赖引入打印日志报错的两种解决方法
  • 腿足机器人之一- 机械与电子组件概览
  • 机器学习:决策树
  • Java进阶笔记(中级)
  • 【Linux探索学习】第二十七弹——信号(上):Linux 信号基础详解
  • HCIA综合项目之多技术的综合应用实验
  • 第12周:LSTM(火灾温度)
  • C#学习之DateTime 类
  • Generate html
  • 【练习】图论
  • 在vue3中vue-cropper的初使用
  • 用java实现word(docx)转换为pdf格式文档(简单版)
  • PyInstaller在Linux环境下的打包艺术
  • AndroidStudio中可用的Ai插件
  • 【xdoj离散数学上机】T283
  • 微软编程之C#如何学习,C#学习路线:从入门到精通
  • Docker Desktop WebAPI《1》
  • 【DuodooBMS】基于Odoo的开源制造执行系统——以开源之力,驱动智能制造
  • NO.16十六届蓝桥杯备战|for循环|七道习题|ceil|floor|pow(C++)
  • 以什么方式维护html网页的多语言版本比较好
  • 英文搜索网站/seo优化排名
  • 网站主机名/营销策划与运营团队
  • 59做网站/台州网站优化公司
  • 淮南市住房与城乡建设部网站/比较好网站制作公司
  • 孝感网站开发优搏快/seo数据是什么意思
  • 怎么做网站分析/seo软件推荐