天天看点

优先队列的实现--二叉堆

// 二叉堆 -- 用于优先队列的实现
// 完全二叉树的 I 结点的 两个 child 是 I*2 and I*2+1 . --二叉树的性质
// 完全二叉树的 I 结点的 father 是 I/2 .  --二叉树的性质
// 队列结构 -> head -> queue -> bottom -> 
// head in, bottom out
// 
/*
test data 一共10个数字 输入输出的时候需要更改 
12
8
3
5
6
7
15
1 
10
9
Output:1 3 5 6 7 8 9 10 15
*/
#include <cstdio>
#include <iostream>
using namespace std;

const int MAXQ = 10000;
int head; // 只需要队列入口的指向   

int prority_queue[MAXQ];


void swap(int& a,int& b){
	a^=b^=a^=b;
}


bool is_empty(){
	return head - 1;
}

void InQueue(int a){
	int node = head;
	int father = node /2 ; // /2
	prority_queue[head++] = a;
	while(prority_queue[node] < prority_queue[father]){
		swap(prority_queue[node], prority_queue[father]);
		node = father;
		father = node /2 ; // /2
	}
	 // ensure right child bigger than left child, impossible!!

}

int DeQueue(){
	int val = prority_queue[1]; // the bottom of queue 
	int node = 1;
	int temp_head = prority_queue[--head]; // let the head element out queue
	while(node*2 < head){
		int temp_node = node; // save father node
		node = node << 1; // *2
		if (node+1 == head || prority_queue[node] < prority_queue[node+1]) // choose the smaller rise
			swap(prority_queue[node],prority_queue[temp_node]);
		else{ // 可以再优化
			swap(prority_queue[node+1],prority_queue[temp_node]);
			node = node + 1;
		}
	}
	prority_queue[node] = temp_head; // make the original element into the blank site
	int father = node /2 ; // /2  adjust the element to a appropriate site
	while(prority_queue[node] < prority_queue[father]){
		swap(prority_queue[node], prority_queue[father]);
		node = father;
		father = node /2 ; // /2
	}
	prority_queue[head] = 0;

	return val;
}

void init(){
	head = 1; // queue start with '1'
	memset(prority_queue,0,sizeof(prority_queue));
	int n,a;
	n = 10;
	for (int i = 0 ; i < n ;i++){
		cin >> a;
		InQueue(a);
	}

}

int main()
{
//	freopen("in.txt","r",stdin);
	init();

	for (int i = 0 ; i < 10 ;i++){
		cout << DeQueue() << " ";
	}

	return 0;
}
           

HDU1102(最小生成树prime算法) 这个题目写了一下午+一晚上,一开始还没有了解过stl里面的优先队列是怎么实现的,于是就去看了看关于优先队列的实现。才知道优先队列是可以用二叉堆实现的(附上人家的连接: 二叉堆),然后就手写了一个int型的优先队列,于是我就想着看来离AC不远了,然后当回过头来看题目的时候发现按我的思路数据居然用一个数组放不下,看来还得结构体,于是把int型的改成了结构体的,然后又发现按我的思路这个图还应带有方向,然后又改成有向图。就这样改来改去,还带点小粗心。直到刚刚才给ac了。

继续阅读