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

树上搜索 第32次CCF-CSP计算机软件能力认证

大模拟题:

思路:

1.初始化root为1

2.w数组储存每次得到的w&值

3.更新w数组 遍历每个节点的时候将visited数组+1 表示当前已经遍历到第几轮了(用来计算最优解点的时候排除不是的结点)

4.w数组储存每次得到的w&值

5.根据w&的值判断当前保留树的哪一部分

如果保留当前部分(将根节点设为当前节点)

否则将visited[node]数组的值设为-1(更新w数组的时候不访问)

6.更新root为当前最优结点

屎山代码:

#include<bits/stdc++.h>
using namespace std;
int n, m;
struct node {
    int w;//权重
    vector<int> child;
    int parent;
}tree[2002];
int w[2002];//每个节点的总权重
bool flag[2002] = { true };
//计算整棵树每个结点的权重 返回权重
int Compute(int root){
    //如果已经不属于
    if (!flag[root]) return 0;
    w[root] = tree[root].w;
    if (tree[root].child.size() == 0) {
        return w[root];
    }
    for (int c : tree[root].child) {
        w[root] += Compute(c);
    }
    return w[root];
}
//计算当前的权值绝对值
vector<int> Compute_W(int root) {
    //初始化总权重数组
    fill(w, w + 2002, 0);
    Compute(root);
    vector<int> ww(n + 1, INT_MAX);
    for (int i = 1; i <= n; i++) {
        ww[i] = abs(w[i]-(w[root]-w[i]));
    }
    return ww;
}
void pprint(vector<int> num) {
    for (int i = 0; i < num.size(); i++) {
        cout << num[i] << " ";
    }
    cout << endl;
}
bool isAncestor(int now, int ancestor) {
    if (now == -1)
        return false;
    if (now == ancestor)
        return true;
    return isAncestor(tree[now].parent, ancestor);
    
}
//表示失效
void dfs(int root) {
    flag[root] = false;
    if (tree[root].child.size() == 0)
        return;
    for (int c : tree[root].child)
        dfs(c);
}
//计算当前有效节点个数
int count_num() {
    int num = 0;
    for (int i = 1; i <= n; i++) {
        if (flag[i] == true)
            num++;
    }
    return num;
}
//输出若干整数 代表现在问是否属于这个类别
void solve(int c) {
    //初始化根节点
    int root = 1;
    //初始化标记
    fill(flag, flag + 2002, true);
    //初始化总权重数组
    fill(w, w + 2002, 0);
    while (1) {
        //初始化排序好的数组绝对值差
        vector<int> now_w = Compute_W(root);
        //计算当前的最小绝对值
        int min_index;
        int min = INT_MAX;
        for (int i = 1; i <= n; i++) {
            if (now_w[i] < min) {
                min_index = i;
                min = now_w[i];
            }
        }
        //询问c类别是否属于当前类别
        cout << min_index;
        if (isAncestor(c, min_index)) {
            root = min_index;
            //该结点的以外的子树标记为失效
            if (tree[min_index].parent != -1) {
                flag[tree[min_index].parent] = false;
                for (int c : tree[tree[min_index].parent].child) {
                    if (c != min_index)
                        dfs(c);
                }
            }
        }
        else {
            root = tree[min_index].parent;
            //该结点的子树标记为失效
            dfs(min_index);
        }
        if (count_num() == 1) {
            cout << endl;
            break;
        }
        else {
            cout << " ";
        }
    }
    
}
int main() {
    //n:全部类别的数量
    //m:需要测试的类别数量
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin>>tree[i].w;//权重
    }
    //特殊标记
    tree[1].parent = -1;
    for (int i = 1; i < n; i++) {
        int son = i + 1;
        int parent;
        cin >> parent;
        tree[parent].child.push_back(son);
        tree[son].parent = parent;
    }
    for (int i = 0; i < m; i++) {
        //任务是被归类到该类别的名词 需要提出怎么样最少的问题
        int c;
        cin >> c;
        solve(c);
    }
    return 0;
}

相关文章:

  • 激光院董事长龚赤坤到北京研发中心检查指导工作
  • 深入解析 Spring AI ChatClient:构建高效 AI 应用的终极指南
  • 2025年3月 Scratch图形化四级 真题解析 中国电子学会全国青少年软件编程等级考试
  • ida 使用记录
  • 基于javaweb的SpringBoot新闻视频发布推荐评论系统(源码+部署文档)
  • Windows系统Python多版本运行解决TensorFlow安装问题(附详细图文)
  • 【我的创作纪念日】
  • 使用MVC模式开发cocos游戏功能
  • 基于springboot餐饮连锁店管理系统
  • HTML — 浮动
  • 2-刷力扣问题记录
  • .py文件和.ipynb文件的区别:完整教程
  • 【安装配置教程】在linux使用nginx部署vue项目
  • 【玩泰山派】5、点灯,驱动led (使用python库操作)
  • GMSL 使用 GPIO Forward 功能实现 Frame Sync
  • MetaGPT深度解析:重塑AI协作开发的智能体框架实践指南
  • 云服务器租用费用都受哪些因素影响?
  • QML实现RTSP以及本地解码播放
  • spring cloud OpenFeign 详解:安装配置、客户端负载均衡、声明式调用原理及代码示例
  • 系分论文《论面向服务开发方法在设备租赁行业的应用》
  • 网站后台怎么更新网站/天津seo优化排名
  • 12数据网站建设/引流人脉推广软件
  • 企业网站做多大尺寸/网页快照
  • head first wordpress 中文版/南宁seo主管
  • 广州市 网站 建设/软文投稿平台有哪些
  • 网站常用的一种js幻灯片/国外免费发产品的b2b平台