首页 > 其他分享 >8.14信息学集训_树、搜索与剪枝

8.14信息学集训_树、搜索与剪枝

时间:2024-08-14 12:05:40浏览次数:6  
标签:rt 剪枝 信息学 int tr dfs 点击 二叉树 8.14

目录

P1305 新二叉树

点击查看代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 310, INF = 0x3f3f3f3f;
char a, b, c, rt, tr[N][2];
int n;
// pre(u) : 先序遍历以 u 为根的子树
void pre(char u) {
    if (u == '*')
        return;
    cout << u;      // 遍历 u,即根节点
    pre(tr[u][0]);  // 遍历 u 的左儿子
    pre(tr[u][1]);  // 遍历 u 的右儿子
}
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a >> b >> c;
        if (i == 0)
            rt = a;
        tr[a][0] = b;
        tr[a][1] = c;
    }
    pre(rt);
    return 0;
}

B3642 二叉树的遍历

点击查看代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6, INF = 0x3f3f3f3f;
int n, tr[N][2];
// struct Node {
//     int l, r;
// } tree[N]; // 还可以使用结构体封装左右儿子

// pre(u) : 先序遍历以 u 为根的子树
void pre(int u) {
    if (u == 0)
        return;
    cout << u << " ";  // 遍历 u,即根节点
    pre(tr[u][0]);     // 遍历 u 的左儿子
    pre(tr[u][1]);     // 遍历 u 的右儿子
}
void in(int u) {
    if (u == 0)
        return;
    in(tr[u][0]);      // 遍历 u 的左儿子
    cout << u << " ";  // 遍历 u,即根节点
    in(tr[u][1]);      // 遍历 u 的右儿子
}
void post(int u) {
    if (u == 0)
        return;
    post(tr[u][0]);    // 遍历 u 的左儿子
    post(tr[u][1]);    // 遍历 u 的右儿子
    cout << u << " ";  // 遍历 u,即根节点
}

int main() {
    cin >> n;
    for (int i = 1, l, r; i <= n; i++) {
        cin >> l >> r;
        tr[i][0] = l, tr[i][1] = r;
    }
    pre(1), cout << endl;
    in(1), cout << endl;
    post(1), cout << endl;
    return 0;
}

P4913 【深基16.例3】二叉树深度

点击查看代码
#include <bits/stdc++.h>  // 万能头
using namespace std;
const int N = 1e6 + 10;
struct T {
    int l, r;
} tree[N];

int dfs(int rt) {
    if (tree[rt].l == 0 && tree[rt].r == 0) return 1;
    return max(dfs(tree[rt].l), dfs(tree[rt].r)) + 1;
}
int main() {
    int n;
    scanf("%d", &n);
    for (int i = 1, l, r; i <= n; i++) {
        scanf("%d%d", &l, &r);
        tree[i].l = l;
        tree[i].r = r;
    }
    printf("%d\n", dfs(1));
    return 0;
}

P3884 [JLOI2009] 二叉树问题

点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6, INF = 0x3f3f3f3f;
vector<int> g[N];
int n, v1, v2, v3, dep[N], st[N], p[N];

void dfs(int u, int d) {
    dep[u] = d, v1 = max(v1, d), v2 = max(v2, ++st[d]);
    for (auto v : g[u]) {
        p[v] = u, dfs(v, d + 1);
    }
}
int main() {
    cin >> n;
    int u, v;
    for (int i = 1; i <= n; i++) {
        cin >> u >> v;
        if (i < n) g[u].push_back(v);
    }
    dfs(1, 1);
    // u -> v
    int up = 0, down = 0;
    while (dep[u] > dep[v]) u = p[u], up++;
    while (dep[u] < dep[v]) v = p[v], down++;
    while (u != v) u = p[u], v = p[v], up++, down++;
    v3 = 2 * up + down;
    cout << v1 << endl << v2 << endl << v3 << endl;
    return 0;
}

P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值

点击查看代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int tr[N], w[N], k, n;
// w[d] :表示深度 d 的所有节点权值和
// dfs(u,d) : 遍历 u为 根节点的子树,深度为 d
void dfs(int u, int d) {
    if (u > n) return;
    w[d] += tr[u], k = max(k, d);
    dfs(2 * u, d + 1);
    dfs(2 * u + 1, d + 1);
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &tr[i]);  // 建树
    dfs(1, 1);

    int id = 1; // 节点权值和最大的深度
    for (int i = 1; i <= k; i++)
        if (w[id] < w[i]) id = i;
    printf("%d", id);
    return 0;
}

P1451 求细胞数量
P1596 [USACO10OCT] Lake Counting S
P1605 迷宫
P1706 全排列问题
P1157 组合的输出
P1036 [NOIP2002 普及组] 选数
P1443 马的遍历
P1135 奇怪的电梯
P1141 01迷宫
P1219 [USACO1.5] 八皇后 Checker Challenge
P1379 八数码难题
P1025 [NOIP2001 提高组] 数的划分
P3958 [NOIP2017 提高组] 奶酪
P5194 [USACO05DEC] Scales S
P1120 小木棍
P1092 [NOIP2004 提高组] 虫食算

点击查看代码

P1032 [NOIP2002 提高组] 字串变换

点击查看代码

P1019 [NOIP2000 提高组] 单词接龙

点击查看代码

P1434 [SHOI2002] 滑雪

点击查看代码

P1040 [NOIP2003 提高组] 加分二叉树

点击查看代码

P1074 [NOIP2009 提高组] 靶形数独

点击查看代码

P2827 [NOIP2016 提高组] 蚯蚓

点击查看代码

T266208 小猫爬山

点击查看代码

标签:rt,剪枝,信息学,int,tr,dfs,点击,二叉树,8.14
From: https://www.cnblogs.com/hellohebin/p/18358629

相关文章

  • 8.14 为某人的言论提供一点理论基础
    看了8.13朋友的愿景,我不由联想起PMBOK中定义的高绩效项目团队。所有人都喜欢高绩效项目团队,因为协作者有动力,领导者很放心。怎么打造一个高绩效项目团队?PMBOK中给出了九个有关因素。开诚布公的沟通、共识、共享责任、信任、协作、适应性、韧性、赋能、认可(需要指出:这九......
  • 新坑:信息学奥赛一本通题解(3001~3005)
    前言Hello,大家好我是文宇,开个新坑,是关于信息学奥赛一本通的坑,就是信奥赛题解.(这里指编程启蒙的题库)因为作者的洛谷还在写,只是信奥赛的题写的比较多,所以先做信奥赛的.信奥赛的网址是信息学奥赛一本通-编程启蒙(C++版)在线评测系统(挖坑:作者以后可能还会有信奥赛本体......
  • 8.12信息学集训_摸底
    目录P9955[USACO20DEC]DoYouKnowYourABCs?BP5436【XR-2】缘分P1182数列分段SectionIIP1032[NOIP2002提高组]字串变换P1020[NOIP1999提高组]导弹拦截P1077[NOIP2012普及组]摆花T264125黑暗能量P9955[USACO20DEC]DoYouKnowYourABCs?BP9955[USACO20D......
  • 2021年庐阳区青少年信息学科普日真题- 跳跃(jump)
    题目描述猴子的正上方,每1米处,都有一个桃子,一共有N个桃子,每个桃子都有其能量值,摘下这个桃子吃下就获得了这个能力值。猴子每跳1米会消耗1个点能量,在能量值允许的下,它可以跳到任何一个可以到达的高度,并且将这个高度及以下高度的桃子摘下吃掉。确保猴子初始的能量一定可以摘下......
  • 信息学奥赛一本通 1128 图像模糊处理
    1128:图像模糊处理时间限制:1000ms      内存限制:65536KB提交数:69990   通过数: 30350【题目描述】给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:1.四周最外侧的像素点灰度值不变;2.中间各像素点新灰度值为该像素点及其上下左......
  • 《信息学奥赛一本通编程启蒙》3031-3050(Scratch、C、C++、python)
    3031:练7.3买图书(C、C++、python)3031:练7.3买图书(C、C++、python)-CSDN博客3032:练7.4梯形面积(C、C++、python)3032:练7.4梯形面积(C、C++、python)-CSDN博客3033:【例8.1】人民币支付(Scratch、C、C++、python)3033:【例8.1】人民币支付(Scratch、C、C++、python)-CSDN博客3......
  • 模型压缩-模型蒸馏、模型剪枝、模型量化
    一、模型蒸馏1.1简介知识蒸馏是指通过教师模型指导学生模型训练,通过蒸馏的方式让学生模型学习到教师模型的知识,最终使学生模型达到或媲美教师模型的准确度。在模型压缩中,教师模型是一个预训练好的复杂的模型,而学生模型是一个规模较小的模型。如分类任务中,由训练好的教......
  • 【每日一题】【DFS】【试除法求约数】【大剪枝】清楚姐姐跳格子 牛客周赛 Round 54 D
    牛客周赛Round54D题清楚姐姐跳格子题目背景牛客周赛Round54题目描述样例#1样例输入#1523154样例输出#12做题思路首先知道ai......
  • yolov8的模型剪枝教程
            模型剪枝是用在模型的一种优化技术,旨在减少神经网络中不必要的参数,从而降低模型的复杂性和计算负载,进一步提高模型的效率。    模型剪枝的流程:约束训练(constainedtraining)、剪枝(prune)、回调训练(finetune)    本篇主要记录自己YOLOv8模型剪枝......
  • pytorch中中的模型剪枝方法
     一,剪枝分类 所谓模型剪枝,其实是一种从神经网络中移除"不必要"权重或偏差(weigths/bias)的模型压缩技术。关于什么参数才是“不必要的”,这是一个目前依然在研究的领域。 1.1,非结构化剪枝 非结构化剪枝(UnstructuredPuning)是指修剪参数的单个元素,比如全连接层中的单个权......