关于配对堆的一些小姿势:

1、配对堆是一颗多叉树。

2、包含优先队列的所有功能,可用于优化Dijkstra算法。

3、属于可并堆,因此对于集合合并维护最值的问题很实用。

4、速度快于一般的堆结构(左偏树,斜堆,随机堆……),具体时间复杂度:

  • 合并(Merge):$O(1)$;
  • 插入(Insert/Push):$O(1)$;
  • 修改值(Change):$O(1) \sim O(\log n)$;
  • 取出维护的最值(Top):$O(1)$;
  • 弹出堆顶元素(Pop):$O(\log n)$;

我们依然拿洛谷的P4779 【模板】单源最短路径(标准版)来验证代码的正确性。

以下是配对堆优化Dijkstra算法的AC代码:

#include<bits/stdc++.h>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef pair<int,int> pii;
typedef __gnu_pbds::priority_queue<pii,greater<pii>,pairing_heap_tag> Heap;
const int maxn=1e5+;
const int INF=0x3f3f3f3f; int n,m,s;
struct Edge{
int u,v,w;
Edge(int _u=,int _v=,int _w=){u=_u,v=_v,w=_w;}
};
vector<Edge> E;
vector<int> G[maxn];
void addedge(int u,int v,int w)
{
E.push_back(Edge(u,v,w));
G[u].push_back(E.size()-);
} int d[maxn];
void dijkstra()
{
memset(d,0x3f,sizeof(d)); Heap Q;
Heap::point_iterator id[maxn]; d[s]=;
id[s]=Q.push(make_pair(d[s],s));
while(!Q.empty())
{
int u=Q.top().second; Q.pop();
for(int i=;i<G[u].size();i++)
{
Edge &e=E[G[u][i]]; int v=e.v;
if(d[v]>d[u]+e.w)
{
d[v]=d[u]+e.w;
if(id[v]!=) Q.modify(id[v],make_pair(d[v],v));
else id[v]=Q.push(make_pair(d[v],v));
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
dijkstra();
for(int i=;i<=n;i++) printf("%d%s",d[i],((i==n)?"\n":" "));
}

最新文章

  1. TFS 安装错误
  2. mysql下存储文件问题
  3. sqlite字段属性删除方法
  4. Android数据存储-文件操作
  5. python核心编程第六章练习6-9
  6. B - Encoded Love-letter 字符串的处理
  7. ytu 1041: 迭代法求平方根(水题)
  8. ubuntu恢复rm -rf误删文件
  9. android学习——android架构
  10. Android NDK开发指南---Application.mk文件和android.mk文件
  11. IE6和IE7下绝对定位position:absolute和margin的冲突问题解决
  12. 浅谈Android序列化
  13. 简单的RPC java实现
  14. HDU 3036 Escape 网格图多人逃生 网络流||二分匹配 建图技巧
  15. 1625: [Usaco2007 Dec]宝石手镯
  16. (04) springboot 下的springMVC和jsp和mybatis
  17. Failed to execute &#39;write&#39; on &#39;Document&#39;动态载入的js不能执行write
  18. Python之小练习
  19. bootstrap4.2 导航搜索框
  20. Algorithm(1) - Karatsuba multiplication

热门文章

  1. file命令与magic file【转】
  2. Windows安装Flask Traceback (most recent call last):
  3. ASP.NET CORE的H5上传
  4. 企业安全建设之搭建开源SIEM平台
  5. linux每日命令(35):grep命令
  6. EasyUI Form提交后json数据IE上需要下载(转)
  7. cvCreateImage
  8. Hbase学习笔记——基本CRUD操作
  9. duilib进阶教程 -- Label控件的bug (8)
  10. springboot logback 集成