7-5 堆中的路径
将一系列给定数字插入一个初始为空的小顶堆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
/* Name: Copyright: Author: 流照君 Date: data Description: */ #include <iostream> #include<string> #include <algorithm> #include <vector> #define inf 100005 using namespace std; typedef long long ll; typedef int element_type; typedef struct node *heap; struct node{ element_type *data; int size; int capacity; }; heap creat_heap(int n) { heap min_heap=(heap)malloc(sizeof(heap)); min_heap->data=(element_type*)malloc((n+1)*sizeof(element_type)); min_heap->size=0; min_heap->capacity=n+1; min_heap->data[0]=-inf; return min_heap; } void insert(heap min_heap,int v) { if(min_heap->size==min_heap->capacity-1) return ; min_heap->data[++min_heap->size]=v; int i=min_heap->size; for(;min_heap->data[i/2]>v;i=i/2) min_heap->data[i]=min_heap->data[i/2]; min_heap->data[i]=v; } int main(int argc, char** argv) { #ifdef ONLINE_JUDGE//条件编译,如果有oj则忽略文件读取 #else //freopen("in.txt", "r", stdin);//输入输出文件重定向 //freopen("out.txt", "w", stdout); #endif //#if, #ifdef, #ifndef这些条件命令的结束标志. //代码位置 int n,t,temp,cnt; heap heap1; cin>>n>>t; heap1=creat_heap(n); for(int i=1;i<=n;i++) { cin>>temp; insert(heap1,temp); } while(t--) { cin>>cnt; for(int i=cnt;i>1;i=i/2) { cout<<heap1->data[i]<<" "; } cout<<heap1->data[1]<<endl; } return 0; }
如果你够坚强够勇敢,你就能驾驭他们