优先队列
2015-06-21 12:59
316 查看
优先队列
原始的队列遵循先进先出,队列尾入队列,队头出队列。而优先队列出队列的是优先级最高的那个元素(该优先级次序自己设定),而入队时自动按该优先级顺序插入(插入后调整)。
注意:优先队列利用到堆排序的知识,最好先学堆排序。。。额,没学也没多大事。。。。。
下面给出我用c++写的优先队列的各功能实现。。。
View Code
下面给出一道优先队列的基础题:
http://codeforces.com/contest/129/problem/D
这道题的解题用到优先队列,而且是最基本的暴力。
在c++中,有priority_queue,可以直接用它定义一个优先队列,用法先写一个想要的队列元素的数据结构(也可以是int等基本数据类型),定义好优先级别,就可以使用了: priority_queue<Node> a;
具体用法百度吧。。。
原始的队列遵循先进先出,队列尾入队列,队头出队列。而优先队列出队列的是优先级最高的那个元素(该优先级次序自己设定),而入队时自动按该优先级顺序插入(插入后调整)。
注意:优先队列利用到堆排序的知识,最好先学堆排序。。。额,没学也没多大事。。。。。
下面给出我用c++写的优先队列的各功能实现。。。
#include<stdio.h> #include<string> #include<iostream> using namespace std; #define Max 10000 //队列元素自己设定 typedef struct node { int key; //下面就是优先顺序的设定 bool friend operator < (const node &a,const node &b) { return a.key < b.key; } }Node; //优先队列各项功能实现 class PQueue { private: Node v[Max]; int length; void heap_adjust(int l,int r) //堆排序的核心(调整) { int j=l<<1; Node tmp=v[l]; while(j<=r) { if(j<r&&v[j]<v[j+1]) j++; if(tmp<v[j]) v[l]=v[j]; else break; l=j; j<<=1; } v[l]=tmp; } public: PQueue() { length=0; } //堆排序部分 void creat_heap() { for(int i=length>>1;i>0;i--) heap_adjust(i,length); } void set_size(int len) { length=len; } //如果不用下面的两个函数进行直接赋值或排序,就不需要特地调用creat_heap()函数 void set_value(int i,Node value) { v[i]=value; } void heap_sort() { for(int i=length;i>1;i--) { Node tmp=v[i]; v[i]=v[1]; v[1]=tmp; heap_adjust(1,i-1); } } bool Is_heap() { int j; if(length<=1) return true; for(int i=length>>1;i>0;i--) { j=i<<1; if(j<length&&v[j]<v[j+1]) j++; if(v[i]<v[j]) return false; } return true; } //重头戏,优先队列的入队列和出队列 bool Is_empty() { return length==0; } bool Is_full() { return length==Max-1; } bool push(Node value) { if(Is_full()) return false; v[++length]=value; int i=length; int j=length>>1; while(j>0) { if(!(v[j]<v[i])) break; Node tmp=v[i]; v[i]=v[j]; v[j]=tmp; i=j; j>>=1; } return true; } bool pop() { if(Is_empty()) return false; Node tmp=v[1]; v[1]=v[length]; v[length]=tmp; length--; heap_adjust(1,length); return true; } bool pop(Node &value) { if(Is_empty()) return false; Node tmp=v[1]; v[1]=v[length]; v[length]=tmp; value=v[length]; length--; heap_adjust(1,length); return true; } bool top(Node &value) { if(Is_empty()) return false; value=v[1]; return true; } int size() { return length; } }; int main() { return 0; }
View Code
下面给出一道优先队列的基础题:
http://codeforces.com/contest/129/problem/D
这道题的解题用到优先队列,而且是最基本的暴力。
在c++中,有priority_queue,可以直接用它定义一个优先队列,用法先写一个想要的队列元素的数据结构(也可以是int等基本数据类型),定义好优先级别,就可以使用了: priority_queue<Node> a;
具体用法百度吧。。。
相关文章推荐
- maven archetype:generate 命令简化项目模板数量
- 关于Theme的一些学习见解
- 《Java程序设计》第14周实验作业:GUI编程初步
- Q22 内联函数
- php 用continue加数字实现foreach 嵌套循环中止
- #5 Longest Palindromic Substring
- apache模块开发之helloworld
- 第十四周 *【项目2-用文件保存的学生名单】
- 转换函数
- [转]使用Ubuntu Live CD修复Grub引导教程
- Quartz介绍 使用说明
- 原语??
- 对百度百科SSL证书的解读
- 我该如何理解原语???原语到底是什么???
- R语言 关联规则
- 【读书笔记:C++ primer plus 第六版 中文版】第4章 复合类型
- git和github的代码托管常用命令和操作
- [leetcode] Palindrome Partitioning
- 图说java反射 建议将图下载,用画图打开
- 哪些东西不适合放到数据库