前言

这几天准备保研机试的时候,再次用到了priority_queue,然而好多内容都忘光了(尤其是结构体的排序),废了很多时间才搞明白一些东西,这里简单的记录下。

一、priority_queue与sort的排序顺序

priority_queue的排序方式跟sort相反。比如sort中的<是升序,而priority_queue中的<是降序,也就是大的优先级高。。。这里我看了一些别人的博客,感觉应该是这样理解 记忆。

priority_queue排的是优先级的顺序,并且是在队尾拿取元素,因此与我们认为的顺序相反。
于是,priority_queue与sort默认用less(<),但sort是升序,priority_queue是大根堆。

二、结构体排序

对于结构体,priority_queue需要重载<(因为priority_queue默认用less),重载方式主要有两种。

1.重载<的成员函数
struct pp{int first,second;bool operator <( pp b)const{        //此处的const必须写!!!!,类名前的const可写可不写。return first<b.first;           //这样的重载表示大根堆。//return first>b.first;         //这样表示小根堆。}};priority_queue<pp,vector<pp>,less<pp> > heap;
或者priority_queue<pp> heap;    //因为priority默认用less
2.类外重载<
struct pp{int first,second;bool friend operator<(pp a,pp b){    //放在类内记得加上友元 ,另外不要加const!!!,因为他不是类的一部分,无法成为常成员函数。return a.first<b.first;                      //大根堆}
};priority_queue<pp,vector<pp>,less<pp> > heap;
或者priority_queue<pp> heap;    //因为priority默认用less

当然我们也可以重载>,但此时priority_queue的定义必须三个参数都写上。

struct pp{int first,second;bool operator >( pp b)const{return first>b.first;                  //小根堆//return first<b.first;                //大根堆}/*bool friend operator>(pp a,pp b){return a.first>b.first;               //小根堆//return a.first<b.first;             //大根堆}*/
};priority_queue<pp,vector<pp>,greater<pp> > heap;   //此时定义的时候只能这样定义。

另外我们可以发现不管是重载<还是>,都可以独立实现大小根堆,并且我们还可以发现大小根堆只跟return
后面的表达式有关,(左<右为大根堆,左>右为小根堆),因此我们可以为了方便,只重载<,这样在定义的时候就不用写三个参数了。

三、pair与priority_queue

是不是觉得结构体需要重载运算符很麻烦,那么我们可以用模板pair.

typedef pair<int,int>pp;
priority_queue<pp,vector<pp> , greater<pp> > heap;   //这样就可以啦,但主要在实现小根堆的时候必须写全三个参数
priority_queue<pp> heap;                    //这样只能为大根堆。

访问时的方式

pp a;
a.first,a.second;

四、以一段优先队列优化的prime结束吧

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>using namespace std;typedef long long ll;const int N = 1010,M = 200010,inf = 0x3f3f3f3f;int head[N],to[M],ne[M],w[M],idx = 0;struct node{int a,d;bool operator> (const node b)const {return d > b.d;}
};int n,m;
int d[N],vt[N];
int ans = -inf;
int prime(){memset(d,0x3f,sizeof d);d[1] = 0;int t = 1;priority_queue<node,vector<node>,greater<node> > q;q.push({1,0});int cnt = 0;while(!q.empty() && cnt <= n){node t = q.top();q.pop();if(vt[t.a])continue;cnt++;vt[t.a] = 1;ans = max(ans,t.d);for(int i = head[t.a];~i;i = ne[i]){int j = to[i];if(vt[j])continue;if(w[i] < d[j]){d[j] = w[i];q.push({j,w[i]});}}}if(cnt < n)return -1;return ans;
}void add(int a,int b,int c){w[idx] = c,to[idx] = b,ne[idx] = head[a],head[a] = idx++;
}int main(){cin>>n>>m;memset(head,-1,sizeof head);for(int i = 0;i < m;i++){int a,b,c;cin>>a>>b>>c;add(a,b,c),add(b,a,c);}cout<<prime()<<endl;return 0;
}

再探c++ priority相关推荐

  1. 再探C#类与结构体究竟谁快——考虑栈变量、栈分配、64位整数、密封类

    上次我对C#类与结构体做了一次速度评测(http://blog.csdn.net/zyl910/article/details/6788417).经过一段时间思索,发现还可以进一步探讨-- 第一.栈变 ...

  2. SAP MM 工序委外场景再探 – 相关采购申请单据中的总账科目确定

    SAP MM 工序委外场景再探 – 相关采购申请单据中的总账科目确定 如下的采购申请,是工序委外场景的采购申请, 它在工单1000030 Release的时候被自动触发. 问题是:这个PR上的总账科目 ...

  3. 【Vue.js 牛刀小试】:第九章 - 组件基础再探(data、props)

    系列目录地址 一.基础知识概览 第一章 - 一些基础概念(posted at 2018-10-31) 第二章 - 常见的指令的使用(posted at 2018-11-01) 第三章 - 事件修饰符的 ...

  4. RxSwift学习--核心逻辑再探

    前言 通过上一篇内容RxSwift学习--核心逻辑初探,对RxSwift有了些初步的认知,下面通过源码来看一下RxSwift到底有多骚 RxSwift核心逻辑再探 先把上篇中的例子代码搬过来: //第 ...

  5. 【CTF大赛】2021 DASCTF July cybercms 一探再探

    引言 在前不久结束的 2021 DASCTF July X CBCTF 4th 比赛中,有一道名为 cybercms 的 web 题目. 预期解是从后台登录处进行 SQL 注入写入一句话木马,然而咱在 ...

  6. 联发科mtk手机处理器怎么样_5G手机价格将再探新低!联发科天玑700芯片发布:入门级5G处理器...

    ↑↑↑点击上方蓝字订阅每日最新国产手机资讯 今年5G手机的普及之所以能进展的如此迅速,联发科在5G芯片领域的的活跃功不可没.今天一早,联发科发布的全新的天玑700移动平台,标志着5G手机的价格将进一步 ...

  7. C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员

    文章目录 构造函数再探 以下代码共调用多少次拷贝构造函数 委托构造函数 概念 形式 匿名对象 友元 友元的声明 友元类 令成员函数作为友元 函数重载和友元 注意 内部类 特性 类的const成员 可变 ...

  8. 函数重载、引用再探、内联函数

    文章目录 函数重载 为什么C++支持重载,C语言不支持呢? extern "C" 引用再探 引用的特性 引用的使用场景 引用和指针 引用和指针的不同点: 内联函数 什么是内联函数? ...

  9. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

  10. C++之再探参数绑定bind、bind1st、bind2nd、placeholders占位符

    相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essential C++>笔记之设计一个泛型算法(二) 相关 ...

最新文章

  1. nginx0.8 + php-5.3.4 + memcached
  2. 如何使用Jekyll+GitHub Pages搭建个人博客站点
  3. java面向对象编程知识点总结
  4. 深度剖析Apache Shardingsphere对分布式事务的支持
  5. java 对象引用传递
  6. XNA中三维空间物体的几种旋转方法
  7. python 38day--CSS简介
  8. 220v转5v阻容降压电路
  9. k折交叉验证优缺点_R语言中K邻近算法的初学者指南:从菜鸟到大神(附代码&链接)...
  10. amd自定义分辨率_Intel首款独显性能走光:AMD/NVIDIA芒刺在背
  11. CrazyWing:Python自动化运维开发实战 十八、Python面向对象
  12. java设计模式之模板方法模式(Template Method)
  13. excel 某个单元格不是等于空值,EXCLE中如何通过判断另外一个单元格是否为空来确定单元格的数值_excel不为空的函数...
  14. 高精度NTC测温的硬件电路以及软件设计
  15. 奥西400服务器维修,奥西tds400驱动
  16. 【基于时间序列的变形观测的数据处理方法的研究】
  17. Java对象扁平化的操作
  18. PR AE安装成功后启动卡死的解决
  19. python kivy事件_python – Kivy:使用on_press事件更改屏幕管理器中的屏幕
  20. 玩一玩Google涂鸦中的《吃豆人》

热门文章

  1. 分治策略-股票获取最大收益-最大子数组问题
  2. 金士顿内存条真假测试软件,金士顿内存条真伪怎么看?金士顿内存条判别真伪的几种方法...
  3. Learned Bloom filter
  4. H3C s5820v2 堆叠2台机器配置说明
  5. 知道君推荐给大家一些写论文、搞科研、读大学必备的30款软件。
  6. 2006年网络名言100句(转)
  7. adt matlab 加速退化,可靠性加速退化试验
  8. 关于socket阻塞与非阻塞情况下的recv、seng、read、write返回值问题
  9. Skyscrapers (hard version)(1900/单调栈)
  10. vue+css3 旋转木马效果