优先队列

Dijkstra算法堆优化详解

99封情书 提交于 2019-11-28 03:54:39
DIJ算法的堆优化 DIJ算法的时间复杂度是 \(O(n^2)\) 的,在一些题目中,这个复杂度显然不满足要求。所以我们需要继续探讨DIJ算法的优化方式。 堆优化的原理 堆优化,顾名思义,就是用堆进行优化。我们通过学习朴素DIJ算法,明白DIJ算法的实现需要从头到尾扫一遍点找出最小的点然后进行松弛。这个扫描操作就是坑害朴素DIJ算法时间复杂度的罪魁祸首。所以我们使用小根堆,用优先队列来维护这个“最小的点”。从而大大减少DIJ算法的时间复杂度。 堆优化的代码实现 说起来容易,做起来难。 我们明白了上述的大体思路之后,就可以动手写这个代码,但是我们发现这个代码有很多细节问题没有处理。 首先,我们需要往优先队列中push最短路长度,但是它一旦入队,就会被优先队列自动维护离开原来的位置,换言之,我们无法再把它与它原来的点对应上,也就是说没有办法形成点的编号到点权的映射。 我们用pair解决这个问题。 pair是C++自带的二元组。我们可以把它理解成一个有两个元素的结构体。更刺激的是,这个二元组有自带的排序方式:以第一关键字为关键字,再以第二关键字为关键字进行排序。所以,我们用二元组的first位存距离,second位存编号即可。 然后我们发现裸的优先队列其实是大根堆,我们如何让它变成小根堆呢? 有两种方法,第一种是把第一关键字取相反数,取出来的时候再取相反数。第二种是重新定义优先队列:

深入理解Java PriorityQueue

爷,独闯天下 提交于 2019-11-28 00:39:38
PriorityQueue 类 Java中PriorityQueue(优先队列)通过二叉小顶堆实现,可以用一棵完全二叉树表示。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator,类似于C++的仿函数)。 PriorityQueue 类定义如下: public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializable {} PriorityQueue 要点 PriorityQueue 实现了 Serializable,支持序列化。 PriorityQueue 类是基于优先级堆实现的无界优先级队列。 PriorityQueue 中的元素根据自然顺序或 Comparator 提供的顺序排序。 PriorityQueue 不接受 null 值元素。 PriorityQueue 不是线程安全的。 入队和出 队的时间复杂度是 O(log(n))。 PriorityQueue 原理 Java中 PriorityQueue 实现了 Queue 接口,不允许放入 null 元素

C++优先队列详解

北战南征 提交于 2019-11-27 19:04:35
转自csdn的文章,仅作为学习笔记。原文链接: https://blog.csdn.net/weixin_36888577/article/details/79937886 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。 在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。 首先要包含头文件 #include<queue> , 他和 queue 不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。 优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。 和队列基本操作相同: 1.top 访问队头元素 2.empty 队列是否为空 3.size 返回队列内元素个数 4.push 插入元素到队尾 (并排序) 5.emplace 原地构造一个元素并插入队列 6.pop 弹出队头元素 7.swap 交换内容 定义:priority_queue<Type, Container, Functional> Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list

Bacteria(优先队列)

你。 提交于 2019-11-27 18:49:39
题目链接 : http://codeforces.com/gym/101911/problem/C 问题简述 :给定n个细胞以及每个细胞的大小,相同的细胞能进行融合,如果能融合到只剩1个细胞则输出需要额外增加多少细胞才能把全部融合到只剩一个细胞,如果不能则输出-1. 问题分析 :每融合一次都要排序,所以用优先队列。 1 /* */ 2 # include <iostream> 3 # include <stdio.h> 4 # include <string.h> 5 # include <string> 6 # include <cstdlib> 7 # include <cmath> 8 # include <climits> 9 # include <cctype> 10 # include <iomanip> 11 # include <cassert> 12 # include <deque> 13 # include <queue> 14 # include <stack> 15 # include <vector> 16 # include <utility> 17 # include <list> 18 # include <set> 19 # include <map> 20 # include <functional> 21 # include <ctime>

JAVA中PRIORITYQUEUE详解

南楼画角 提交于 2019-11-27 15:33:21
转自: https://www.cnblogs.com/Elliott-Su-Faith-change-our-life/p/7472265.html Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对PriorityQueue建立清晰而深入的认识。 总体介绍 前面以Java ArrayDeque 为例讲解了 Stack 和 Queue ,其实还有一种特殊的队列叫做 PriorityQueue ,即优先队列。 优先队列的作用是能保证每次取出的元素都是队列中权值最小的 (Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系, 元素大小的评判可以通过元素本身的自然顺序( natural ordering ),也可以通过构造时传入的比较器 ( Comparator ,类似于C++的仿函数)。 Java中 PriorityQueue 实现了 Queue 接口,不允许放入null元素;其通过堆实现,具体说是通过完全二叉树( complete binary tree )实现的 小顶堆 (任意一个非叶子节点的权值,都不大于其左右子节点的权值),也就意味着可以通过数组来作为 PriorityQueue

Ugly Numbers UVA - 136(优先队列+vector)

非 Y 不嫁゛ 提交于 2019-11-27 09:28:28
Problem Description Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ...shows the first 11 ugly numbers. By convention, 1 is included. Write a program to find and print the 1500’th ugly number Input There is no input to this program. Output Output should consist of a single line as shown below, with '<number>' replaced by the number computed. SampleOutput The 1500'th ugly number is <number> . 题目大意: 丑数是指不能被2,3,5以外的其他素数整除的数。把丑数从小到大排列起来 结果如下: 1,2,3,4,5,6,8,9,10,12,15,… 求第1500个丑数 思路: 一般暴力求解那肯定会 T ,所以我们可以借助优先队列将其进行优化,注意的是需要用long long

(九) 堆和优先队列

偶尔善良 提交于 2019-11-27 07:15:52
文章目录 优先队列 什么是优先队列 堆的基本结构 使用数组存储堆 堆的使用操作 向堆中添加元素和shiftUp 取出堆的最大元素和shiftDown replace 替换操作 heapify 操作 堆的实现代码 优先队列的实现(使用堆) leetCode例题 优先队列 什么是优先队列 普通队列: 先进先出, 后进后出 优先队列: 出队顺序和入队顺序无关, 和优先级相关 堆的基本结构 二叉堆是一棵二叉树 二叉堆是一棵完全二叉树( 完全二叉树就是把元素一层一层的排列, 直到排不下为止) 堆的某个节点值总是不大于其父节点的值(最大堆) 使用数组存储堆 因为堆是完全二叉树, 所以可以把堆一层一层的放入数组. 使用数组实现二叉结构 此时计算节点如下: parent(i) = i/2; left child(i) = i * 2; right child(i) = i * 2 + 1; 堆的使用操作 向堆中添加元素和shiftUp shiftUp, 就是将一个元素, 上浮到符合堆性质的位置. 取出堆的最大元素和shiftDown shiftDown, 和shiftUp类似, 就是把一个元素下浮到指定位置 replace 替换操作 replace: 取出最大元素后, 放入一个新元素 实现: 可以先extractMax, 再add, 两次O(logn)的操作 实现:

Labeling Balls POJ - 3687 优先队列 + 反向拓扑

我的未来我决定 提交于 2019-11-27 03:48:54
优先队列 + 反向拓扑 //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<cstring> using namespace std; const int maxn = 1e5 + 7; int n, m; vector<int>G[maxn]; int inDeg[maxn]; int dp[maxn]; int cnt; int sum ,ans ; int mp[1000][1000]; bool topsort() { //queue<int>q; priority_queue<int>q; //queue<int>q; cnt = 0; sum = 0; while(!q.empty())q.pop(); for(int i = 1; i <= n ; i++) if(!inDeg[i]) q.push(i); while(!q.empty()) { int now = q.top(); q.pop(); // cout << now << endl; sum ++; dp[now] = n--; // cout << dp[now] << endl; for(int i = 0; i < G[now].size

HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】

a 夏天 提交于 2019-11-27 02:41:51
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源: 2019 Multi-University Training Contest 1 题目大意: 给定一张有向图,可以阻碍若干条有向边,花费为边的权值,求使其最短路变得更长所需的最小花费。 解题思路: 1.因为最短路可能是多条,所以找出最短路网络,然后在最短路网络中跑最小割,即最大流。就切断了原先的最短路且保证了是最小花费(最小割)。 2.值得注意的地方:边的长度限制为1e9,所以最短路数组以及一些其他的求和的值要开long long型,防止爆。 3.求最短路核心边需满足 dis[u] + edge[i].w == dis[v] 。那么edge[i].w就是一条最短路的核心边。同时要确保合法性,满足 dis[u] != inf && dis[v] != inf 代码如下: #include<stdio.h> #include<string.h> #include<queue> #define LL long long #define mem(a, b) memset(a, b, sizeof(a)) const int MAXN = 1e4 + 100; const LL inf = 0x3f3f3f3f; using namespace std; int n, m;/

暑假集训 - 8.10 总结

半城伤御伤魂 提交于 2019-11-26 20:57:56
学习内容: 哈夫曼树 + 单调栈 完成题数:3 题 看书情况:10 页 学习内容: 优先队列重载: https://www.cnblogs.com/buhuiflydepig/p/11330996.html 做题总结: AcWing 148: https://www.cnblogs.com/buhuiflydepig/p/11330527.html AcWing 149: https://www.cnblogs.com/buhuiflydepig/p/11330942.html AcWing 131: https://www.cnblogs.com/buhuiflydepig/p/11332888.html 心得: 看了一下STL容器,以及学了一下优先队列的重载,之前许多不是很熟,今天熟悉了一下。 来源: https://www.cnblogs.com/buhuiflydepig/p/11333174.html