数据结构_Search
问题描述
可怜的 Bibi 刚刚回到家,就发现自己的手机丢了,现在他决定回头去搜索
自己的手机。
现在我们假设 Bibi 的家位于一棵二叉树的根部。在 Bibi 的心中,每个节点
都有一个权值 x,代表他心中预感向这个节点走可能找回自己手机的程度(虽然
他的预感根本不准)。 当 Bibi 到达一个节点时,如果该节点有未搜索过的儿子节
点,则 Bibi 会走向未搜索过的儿子节点进行搜索,否则就返回父亲节点。 如果
某节点拥有两个未搜索过的儿子节点, Bibi 会选择先搜索权值大的儿子节点。
假设 Bibi 从一个节点到达另一个节点需要 1 单位时间,搜索节点的时间忽
略不计,那么请问当 Bibi 的手机位于编号为 k 的节点时,他需要多少单位时间
才能找到手机。
★ 数据输入
输入第一行为一个正整数 n(1≤n≤100000) 表示树的节点数目,树根的编号
总是为 1。
接下来 n-1 行, 每行两个正整数 p, x(1≤x≤100)。 代表编号为 i 的节点的父
亲节点 p 和权值 x。这里的 i 从 2 依次数到 n。 数据保证输入的 p 小于当前的 i,
且互为兄弟的两个节点的权值 x 不同。
第 n+1 行一个整数 m(1≤m≤n), 表示询问组数。
第 n+2 行有 m 个整数,每个整数 ki(1≤ki≤n) 代表该组询问中手机的位置。
★ 数据输出
输出 m 行, 每行一个整数,代表 Bibi 找到手机需要花费的单位时间数量。
输入示例 | 输出示例 |
3 1 20 1 30 3 1 2 3 |
0 3 1 |
解题思路
二叉树dfs走一遍
应注意的是对于每一个节点,进入节点与退出节点step都应+1
code
#include <stdio.h> #include <stdlib.h> #include <string.h>struct Node {Node(){}int weight;int step;int left;int right; };Node *arr = NULL; int step = 0;void dfs(int index) {arr[index].step = step;++step;if(arr[index].left==0){}else if(arr[index].right==0){dfs(arr[index].left);}else if(arr[arr[index].left].weight > arr[arr[index].right].weight){dfs(arr[index].left);dfs(arr[index].right);}else{dfs(arr[index].right);dfs(arr[index].left);}++step; }int main() {int i;int n,m,k;scanf("%d",&n);arr = (Node *)malloc(sizeof(Node)*(n+1));memset(arr,0,sizeof(Node)*(n+1));int fa_index,weight;for(i=2;i<=n;i++){scanf("%d %d",&fa_index,&weight);if(arr[fa_index].left==NULL)arr[fa_index].left = i;else // (arr[fa_index].left!=NULL)arr[fa_index].right = i;arr[i].weight = weight;}dfs(1);scanf("%d",&m);for(i=1;i<=m;i++){scanf("%d",&k);printf("%d ",arr[k].step);}free(arr);return 0; }
转载于:https://www.cnblogs.com/cbattle/p/7790227.html
数据结构_Search相关推荐
- 数据结构+算法 学习计划与资源
学了很多杂乱的技术,继续成长 渐感吃力,重新学习数据结构 与 算法. 计划: 1.严蔚敏<数据结构><大话数据结构>,每天一个小例子. 2.采用C++ 或者C .尽量用C++实 ...
- 【ES系列】ES的数据结构与DSL语法
ES的数据结构与DSL语法 数据结构部分 正向索引与倒排索引 定义 结构 分词(keyword) DSL语句 常用DSL语句 索引部分 创建索引 查看es所有索引 查看单个索引 删除索引 文档部分 创 ...
- Elasticsearch 入门 核心概念 数据结构 分词器 javaAPI
ElasticSearch 1-今日内容 2-初识ElasticSearch 2.1-基于数据库查询的问题 2.2-倒排索引 2.2.1 评分TF/IDF/BM25计算 2.3-ES存储和查询的原理 ...
- 数据结构(08)— 线性单链表基本操作
1. 线性单链表数据结构 // 假定每个结点的类型用 SNode 表示 typedef struct SNodeTag {int data; // 所存储的数据元素SNodeTag *next; // ...
- 数据结构(06)— 线性循环链表实战
1. 循环链表定义 单链的循环链表结点的存储结构和单链表的存储结构一样, 所不同的是: 最后一个结点的 next 域指向头结点, 而不是"空".这样, 由表尾很容易找到表头. 但若 ...
- 数据结构(05)— 线性单链表实战
1. 设计思路 本项目的实质是完成对考生信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结 ...
- 数据结构(04)— 线性顺序表实战
1. 设计思路 本实战的实质是完成对学生成绩信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运 ...
- 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)
我们先来看一个关于查找的例子.查找,就是从复杂的数据结构中,找到满足某个条件的元素.通常可从以下两个方面来对数据进行查找操作: 根据元素的位置或索引来查找: 根据元素的数值特征来查找. 针对上述两种 ...
- 数据结构(02)— 时间复杂度与空间复杂度转换
1. 时间复杂度转化为空间复杂度 常用的降低时间复杂度的方法有递归.二分法.排序算法.动态规划等,降低空间复杂度的核心思路就是,能用低复杂度的数据结构能解决问题,就千万不要用高复杂度的数据结构. ...
最新文章
- Linux8-bash shell的基础特性:globbing、IO重定向及管道
- 《数据库系统概念》7-函数、存储过程、触发器
- 85. Leetcode 746. 使用最小花费爬楼梯 (动态规划-基础题)
- 阿里90后工程师,如何用AI程序写出双11打call歌?
- ​【文末有福利】揭秘阿里中台!一文看懂阿里推荐业务的两项利器
- r语言实现sem_统计基础:【18】使用Excel和R语言来实现抽样
- 【转】拷贝构造函数的参数类型必须是引用
- 微信小程序调查报告(二)-账号注册篇
- virtual关键字的使用(C# 参考)
- a算法和a*算法的区别_机器人路径规划算法,全局路径规划与局部路径规划究竟有哪些区别?...
- ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
- js2D物理引擎插件
- Windows2008虚拟机扩容C盘
- CARLA 笔记(05)— Actors and blueprints(创建和修改 Blueprint、生成 Spawning、使用 Handling、销毁 Destruction)
- js立即执行函数,jqueryReady和Onload执行顺序比较
- iOS 导航栏下拉菜单框
- WPS文字中通过宏加快捷键实现仿word中Lorem()函数的功能
- unicode字符转换成中文
- 北美电影票房Top10-2020年1月31日:《绝地战警3》三连冠
- Rails中嵌套表单的解决