让priority_queue支持小根堆的几种方法

点击这里了解什么是priority_queue

前言

priority_queue默认是大根堆,也就是大的元素会放在前面

例如

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>q;
int a[15]={0,1,4,2,3,5};
const int n=5;
int main()
{
	for(int i=1;i<=n;i++)	q.push(a[i]);
	while(q.size()!=0)
		printf("%d ",q.top()),q.pop();
	return 0;
}

  

它的输出结果是

那如何让priority_queue支持小根堆呢?:question:

方法一

将所有的数全部取负

这样的话绝对值小的数会变大,绝对值大的数会变小

这样就能实现小根堆了

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>q;
int a[15]={0,1,4,2,3,5};
const int n=5;
int main()
{
	for(int i=1;i<=n;i++)	q.push(-a[i]);
	while(q.size()!=0)
		printf("%d ",-q.top()),q.pop();
	return 0;
}

方法二

利用STL中自带的小根堆,很简单,只要在定义的时候写成

 就好

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;//这样就可以实现小根堆了
int a[15]={0,1,4,2,3,5};
const int n=5;
int main()
{
	for(int i=1;i<=n;i++)	q.push(a[i]);
	while(q.size()!=0)
		printf("%d ",q.top()),q.pop();
	return 0;
}

另外

priority_queue是支持自定义比较函数的

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int n=5;
struct node
{
	int x,y;
	node(){x=y=0;}
	node(int a,int b){x=a;y=b;}
};
priority_queue<node>q;
bool operator<(const node &a,const node &b)
{
	if(a.x!=b.x)return a.x>b.x;
	return a.y<b.y;
}
int a[15]={0,1,4,4,3,5};
int b[15]={0,2,1,2,3,4};
int main()
{
	for(int i=1;i<=n;i++)	q.push(node(a[i],b[i]));
	while(q.size()!=0)
		printf("%d %d\n",q.top().x,q.top().y),q.pop();
	return 0;
}

注意:priority_queue自定义函数的比较与sort正好是相反的,也就是说,如果你是把大于号作为第一关键字的比较方式,那么堆顶的元素就是第一关键字最小的

还可以这么写

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int n=5;
struct node
{
	int x,y;
	node(){x=y=0;}
	node(int a,int b){x=a;y=b;}
	bool operator <(const node &a)const
	{
		if(a.x!=x) return a.x<x;
		return a.y>y;
	}
};
priority_queue<node>q;
int a[15]={0,1,4,4,3,5};
int b[15]={0,2,1,2,3,4};
int main()
{
	for(int i=1;i<=n;i++)	q.push(node(a[i],b[i]));
	while(q.size()!=0)
		printf("%d %d\n",q.top().x,q.top().y),q.pop();
	return 0;
}

  

时间: 2024-10-01 15:57:40

让priority_queue支持小根堆的几种方法的相关文章

Nginx支持PHP环境的两种方法

操作系统: CentOS6.5   Nginx软件版本: nginx-1.6.0   PHP软件版本:php-5.3.28 Nginx默认是不支持PHP环境的,我们可以通过两种方法来让Nginx支持PHP环境 方法一:编译安装PHP的时候,在配置时添加PHP的fpm模块"--enable-fpm",用来调用本机的PHP环境 1.编译安装PHP 首先安装PHP所需要的工具包 然后编译安装PHP,在配置的时候加上"--enable-fpm"这个配置项 安装后调整 2.配

让IE6/IE7/IE8支持CSS3属性的8种方法介绍

我们都知道,IE浏览器暂不支持CSS3的一些属性.国外的工程师们,不安于此现状,他们总是尽量使用一些手段使IE浏览器也能支持CSS3属性,我觉得这些都是很有意义,很有价值的工作,可以推动整个技术领域的进步的.到目前为止,有不少可以让IE支持部分CSS3属性的工具.例如: 1. Dean Edwards的IE7.js (以及 IE8.js, IE9.js) 这个玩意估计是试图让IE支持CSS3属性的鼻祖,还算蛮强大,就是性能开销较大,要解析很多文件脚本,给DOM添加大量的元素以及ClassName

让IE6IE7IE8支持CSS3属性的8种方法介绍

我们都知道,IE浏览器暂不支持CSS3的一些属性.国外的工程师们,不安于此现状,他们总是尽量使用一些手段使IE浏览器也能支持CSS3属性,我觉得这些都是很有意义,很有价值的工作,可以推动整个技术领域的进步的.到目前为止,有不少可以让IE支持部分CSS3属性的工具.例如: 1. Dean Edwards的IE7.js (以及 IE8.js, IE9.js) 这个玩意估计是试图让IE支持CSS3属性的鼻祖,还算蛮强大,就是性能开销较大,要解析很多文件脚本,给DOM添加大量的元素以及ClassName

关于网页中不刷新页面改变验证码的两种方法

今天做一个注册的页面,需要输入验证码.验证码的生成是动态的,不过要刷新页面,才能改变验证码,因为刷新后浏览器会向服务器提交新的请求,服务器就动态生成新的验证码响应给浏览器.为了能够在不刷新页面的情况下改变验证码,需要JavaScript的支持. 第一种方法是在请求地址后面带参数,这是一个小窍门.因为浏览器访问服务器的时候地址后面可以带上参数一起传给服务器,而加载内容是只看地址不看后面的参数:另外在<img src="地址"/>中,只要浏览器发现地址改变了就会自动重新加载该地

用小根堆实现dijkstra,求图的单源最短路径

小根堆实现dijkstra 求图的最短路径,最常用的有四种方法: 1.Floyed(弗洛伊德)算法.最简单的最短路径算法,可以求多源最短路径.时间复杂度为O(n*n*n). 2.Dijkstra(迪杰斯特拉)算法.只能求单源最短路径.时间复杂度为O(n*n). 3.Bellman-Ford(贝尔曼福德)算法.只能求单源最短路径.时间复杂度为O(NE)(N为顶点数,E是边数). 4.SPFA算法.为Bellman-Ford算法的队列实现,减少不必要的冗杂计算.只能求单源最短路径.时间复杂度为O(k

堆排序—大根堆,小根堆

1.小根堆 若根节点存在左子女则根节点的值小于左子女的值:若根节点存在右子女则根节点的值小于右子女的值. 2.大根堆 若根节点存在左子女则根节点的值大于左子女的值:若根节点存在右子女则根节点的值大于右子女的值. 3.结论 (1)堆是一棵完全二叉树(如果公有h层,那么1~h-1层均满,在h层连续缺失若干个右叶子). (2)小根堆的根节点的值是最小值,大根堆的根节点的值是最大值. (3)堆适合于采用顺序存储. 4.堆的插入算法 将一个数据元素插入到堆中,使之依然成为一个堆. 算法描述:先将结点插入到

[大、小根堆应用总结一]堆排序的应用场景

前言 在整理算法题的时候发现,大根堆(小根堆)这种数据结构在各类算法中应用比较广泛,典型的堆排序,以及利用大小根堆这种数据结构来找出一个解决问题的算法最优解.因此,我打算单独将关于堆的应用独立总结出来,后面每遇到一种跟堆结构相关的应用都放到这个目录下. 堆的定义 n个关键字序列L[1-n]称为堆,当且仅当该序列满足: 1. L(i)<=L(2i)且L(i)<=L(2i+1)或 2. L(i)>=L(2i)且L(i)>=L(2i+1) 满足第一个条件的成为小根堆(即每个结点值小于它的

bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle——小根堆+大根堆+贪心

Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1<=Mi<=N)只. 他们希望从Si到Ei去.公交车只能座C(1<=C<=100)只奶牛.而且不走重复路线,请计算这辆车最多能满足多少奶牛听要求.注意:对于每一群奶牛,可以部分满足,也可以全部满足,也可以全部不满足. Input 第1行: 三个整数: K,N,C. 由空格隔开. 第2..

在不支持jffs2的DD-WRT里安装Wiwiz的3种方法

在不支持jffs2的DD-WRT里安装Wiwiz的3种方法Wiwiz HotSpot Builder Utility是一个用于创建无线热点的Web认证网关的软件.如果你有一个无线路由器并且能刷DD-WRT固件,就可以很方便地自建一个Web认证方式的Wifi热点.Wiwiz有几种不同的认证方式可以选择,其中有一个很有用的方式就是你可以创建一个计费的WiFi热点,而且可以让热点的用户在认证前通过支付宝或者Paypal在线付费,当用户付费之后,才能连接互联网.不过,并不是所有的DD-WRT版本都能使用