zoukankan      html  css  js  c++  java
  • 堆中的路径

    将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。

    输入格式:

    每组测试第1行包含2个正整数N和M(≤),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。

    输出格式:

    对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。

    输入样例:

    5 3
    46 23 26 24 10
    5 4 3

    输出样例:

    24 23 10
    46 23 10
    26 10
     1 #include <stdio.h>
     2 #define MAXN 1010
     3 #define MINH -10001
     4 
     5 int HT[MAXN],size;
     6 
     7 void Create()//建立空堆 
     8 {
     9     size=0;
    10     HT[0]=MINH;//设置岗哨 
    11 }
    12 
    13 void Insert(int X)//把X放于最后逐个与它的父节点进行比较,很巧妙!
    14 {
    15     int i;
    16     for(i = ++size;HT[i/2]>X;i/=2)
    17     {
    18         HT[i]=HT[i/2];
    19     }
    20     HT[i]=X;
    21 } 
    22 
    23 int main()
    24 {
    25     int  n,m;
    26     while(scanf("%d %d",&n,&m)!=EOF)
    27     {
    28         Create();
    29         int i,T;
    30         for(i=1;i<=n;i++)
    31         {
    32             scanf("%d",&T); 
    33             Insert(T); 
    34         }
    35         while(m--)
    36         {
    37             int g;
    38             scanf("%d",&g);
    39             for(i=g;i>=1;i/=2)//每次坐标除以2得到它的父节点,并输出就是路径
    40             {
    41                 if(i==g)
    42                     printf("%d",HT[i]);
    43                 else
    44                     printf(" %d",HT[i]);
    45             }
    46             printf("
    ");
    47         }
    48     }
    49     return 0;
    50 }

  • 相关阅读:
    linux中关于权限的一些事
    Linux上用IP转发使内部网络连接互联网
    Linux常用基础命令
    linux路径问题
    ansible简介
    linux
    linux常用命令
    ls 命令详解
    Linux 实验 [Day 01]
    Linux SPI通过设备树文件添加设备
  • 原文地址:https://www.cnblogs.com/jiamian/p/10762568.html
Copyright © 2011-2022 走看看