问题描述

可怜的 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 = ; void dfs(int index)
{
arr[index].step = step;
++step;
if(arr[index].left==)
{ }
else if(arr[index].right==)
{
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+));
memset(arr,,sizeof(Node)*(n+)); int fa_index,weight;
for(i=;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();
scanf("%d",&m);
for(i=;i<=m;i++)
{
scanf("%d",&k);
printf("%d ",arr[k].step);
} free(arr);
return ;
}

数据结构_Search的更多相关文章

  1. 数据结构javascript实现

    电脑配置 CPU:AMD X4 640 内存: 宏想 DDR3 1600MHz 8g 主板:华擎 980DE3/U3S3 R2.0 浏览器:chrome 79.0.3945.88(正式版本) (64 ...

  2. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  3. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  4. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  5. 算法与数据结构(十五) 归并排序(Swift 3.0版)

    上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...

  6. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  7. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  8. 算法与数据结构(八) AOV网的关键路径

    上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...

  9. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

随机推荐

  1. CF 949C Data Center Maintenance——思路+SCC

    题目:http://codeforces.com/contest/949/problem/C 可以想到可能是每组c有连边的可能. 但别直接给c1.c2连边,那样之后会变得很不好做. 可以把一些限制放在 ...

  2. js中call apply方法的使用介绍

    js call call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, ...

  3. vijos1264:神秘的咒语

    描述 身为拜月教的高级间谍,你的任务总是逼迫你出生入死.比如这一次,拜月教主就派你跟踪赵灵儿一行,潜入试炼窟底. 据说试炼窟底藏着五行法术的最高法术:风神,雷神,雪妖,火神,山神的咒语.为了习得这些法 ...

  4. SQL 用;with 由所有的子节点查询到树结构中所有父节点

    1.所有的子节点查询到树结构中所有父节点 RETURNS @Tree Table(PID )) as begin --DECLARE @ID VARCHAR() --SET @ID = ' ;with ...

  5. 关于WinPE安装操作系统

    在WinPE安装操作系统,最好用虚拟光驱打开安装镜像文件,或者把镜像文件解压后直接安装. 最好不要用工具盘里所带的一键安装,复制等等功能,因为这些功能往往会安装一些其他的附带功能,不是清洁版的.

  6. 使用 Github 和 Hexo 快速搭建个人博客

    导语 个人兴趣爱好特别广泛,喜欢捣鼓各种小东西自娱自乐.虽然都没能深入研究,但是自己的“孩子”还是很想拿出来遛遛得人一句夸奖的.所以刚学 Markdown 的时候很是有想过要搭个个人博客来玩玩,一来激 ...

  7. leetcode589

    树的先序遍历,使用递归实现. class Solution { public: vector<Node> Tree; void preTree(Node node) { Tree.push ...

  8. hadoop再次集群搭建(4)-Cloudera Manager Installation

       决定选择 Cloudera Manager 进行安装,阅读官方文档,掌握大概脉络.         Cloudera Manager在集群已经实现ssh免秘钥登录,能够访问网络资源和本地资源的情 ...

  9. if __name__ == "__main__": 的使用

    #!/usr/bin/env python from qq.lib.a2 import register from qq.lib.a3 import login def main(): while T ...

  10. day17-jdbc 5.url介绍

    url用于标识数据库的位置,用于标识找哪个数据库. 总结:url是路径,其实就是确定是哪个数据库.用来确定我用的是哪一个数据库,并且通知我这个Connection或者是这个DriverManager获 ...