图论:dij算法优化:双端队列及详细证明

dij原来的写法请移步这里
首先,让我们举一个洛谷中的情境
这题中,我们可以二分mid答案,小于等于mid的边权是0,大于的是1,再计算最短路是否<=k;
那么在这样边权只有0和1的时候,dij算法是否可以优化呢?

可以

(不然我写这篇blog干嘛)
不必再使用优先队列,而只需要一个双段队列deque就可以解决

做法

做法就是一样每次取出队首,然后每次更新从它延伸出去的那条路权是1就放队尾,权是0就放队首
其他一毛一样
因为deque单次操作时间复杂度是O(1),能比优先队列省一个log,单次dij可以降到n的水平,非常优秀
而且这个法发不必边权是0和1,只要是0和大于0的数就行
当然,算法复杂度再好,前提都得是正确

证明

改用双端队列后,我们只需要证明这样入队仍能维护单调性即可
(因为大于0的任何数本质与1相同,为了方便证明就使用0和1了)

1:+0往前放

首先,假设目前队首是队伍中的min
那么取出队首加0后,仍是min,显然在队列中不会破坏单调性

2:+1往后放

第一步很好证,但+1后的min+1一定是最大值吗?
我们可以用反证法
假设队列中有一个min+2,使min+1破坏了单调性
我们向它提出一个疫情以来最常见的问候语:

你从哪里来的?

学过高等数学的朋友应该知道:
1+1=2
所以一定是从一个min+1再+1得来
但是此时队首还是min
第一步已经从队首的方向证明了单调性,不可能min+1比min先到队首
自相矛盾,假设错误
所以往后放也可以保证单调性

写完嘞,谢谢观看!!!

(还有问题可以评论走哦~~~)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021牛客暑期多校训练营4 B-Sample Game(概率DP)

B-Sample Game ding_ning123大佬题解 注&#xff1a;上述题解图片来自ding_ning123大佬题解 Code #include<bits/stdc.h> using namespace std; using lllong long; template <class Tint> T rd() {T res0;T fg1;char chgetchar();while(!isdigit(ch)) {if(ch-…

P6775-[NOI2020]制作菜品【贪心,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6775 题目大意 nnn种原材料&#xff0c;第iii个有did_idi​个&#xff0c;mmm道菜品都需要kkk个原料而且每道菜最多只能用两种材料。 要求构造方案使得满足条件。 1≤n≤500,n−2≤m≤5000,1≤k≤5000,(∑i1ndi)mk1\leq n\l…

牛客题霸 [螺旋矩阵] C++题解/答案

牛客题霸 [螺旋矩阵] C题解/答案 题目描述 给定一个m x n大小的矩阵&#xff08;m行&#xff0c;n列&#xff09;&#xff0c;按螺旋的顺序返回矩阵中的所有元素。 题解&#xff1a; 其实就是模拟过程&#xff0c;先往左走&#xff0c;走到头向下走&#xff0c;到头后向左走…

递推:Ybtoj: D.4 序列个数

传送门 这题需要使用数形结合的思想 用一个矩形表示序列&#xff0c;若(i&#xff0c;j)点为1&#xff0c;表示第i个数是j 比如&#xff1a; 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 表示的序列是&#xff1a;41235 显然每行和每列都只能有一个1 回到本题&#xf…

codeforces280 C. Game on Tree(期望)

C. Game on Tree 单独考虑每个点对答案的贡献。 删除一个点的方案是删除它或者它的祖先&#xff0c;那么对答案的贡献是1depu\frac 1 {\text{dep}_u}depu​1​ #include<cstdio> #include<vector>int n; std::vector<int> g[100005]; int dep[100005]; vo…

OrchardCore 如何实现模块化( Modular )和 Multi-Tenancy

一、概述通常我们会在 Startup 类通过 void ConfigureServices(IServiceCollection services) 配置应用的服务。常见的形如 AddXXX 的方法&#xff0c;实际上调用的都是 IServiceCollection 或直接说是 ServiceCollection 的 AddSingleton 等方法。调用ApplicationBuilder 的 R…

P2350-[HAOI2012]外星人【线性筛】

正题 题目链接:https://www.luogu.com.cn/problem/P2350 题目大意 给出NNN质因数分解之后的结果&#xff0c;求每次Nφ(N)N\varphi(N)Nφ(N)&#xff0c;多少次后N1N1N1。 N∏i1mpiqi,1≤m≤2000,1≤pi≤105,1≤qi≤109N\prod_{i1}^mp_i^{q_i},1\leq m\leq 2000,1\leq p_i\le…

牛客题霸 [ 最长回文子串] C++题解/答案

牛客题霸 [ 最长回文子串] C题解/答案 题目描述 对于一个字符串&#xff0c;请设计一个高效算法&#xff0c;计算其中最长回文子串的长度。 给定字符串A以及它的长度n&#xff0c;请返回最长回文子串的长度。 题解&#xff1a; 两个方法&#xff1a; 一个是经典暴力&#…

强连通分量:洛谷P3387 模板:缩点

传送门 顾名思义&#xff0c;模板awa #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <string> #include <queue> #include <vector> #define ll long long usi…

2021牛客暑期多校训练营4 E-Tree Xor(异或+思维+区间交 or Trie树)

E-Tree Xor 首先不考虑区间限制条件&#xff0c;我们给定其中一个点的权值后&#xff0c;那么其他点的权值也就确定。比如 val10\text{val}_10val1​0&#xff0c;即可通过变得限制求出其他点valu\text{val}_uvalu​&#xff0c;而且不难发现如果val10⊕a\text{val}_10\oplus …

【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

上篇文章我介绍了如何在网关上实现客户端自定义限流功能&#xff0c;基本完成了关于网关的一些自定义扩展需求&#xff0c;后面几篇将介绍基于IdentityServer4&#xff08;后面简称Ids4&#xff09;的认证相关知识&#xff0c;在具体介绍ids4实现我们统一认证的相关功能前&…

[科技]Loj#6564-最长公共子序列【bitset】

正题 题目链接:https://loj.ac/p/6564 题目大意 给两个序列a,ba,ba,b求它们的最长公共子序列。 1≤n,m,ai,bi≤71041\leq n,m,a_i,b_i\leq 7\times 10^41≤n,m,ai​,bi​≤7104 解题思路 无意间看到的一个bitsetbitsetbitset科技。 首先设fi,jf_{i,j}fi,j​表示aaa串匹配到…

牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案

牛客题霸 [找到字符串的最长无重复字符子串] C题解/答案 题目描述 给定一个数组arr&#xff0c;返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。 题解&#xff1a; i和j两个指针分别指不重复子串的两端&#xff0c;根据情况各自移动&#xff0c;记录最大…

并查集:P1196 [NOI2002] 银河英雄传说

传送门 带权并查集最棒了 dep记录深度&#xff0c;size记录集合大小 转移见代码 #include<cstdio> #include<algorithm> #include<iostream> using namespace std; const int N31000; int n,m; int t; int dep[N],fa[N],size[N]; char s; int a,b; int find…

2021牛客暑期多校训练营4 D-Rebuild Tree(prufer序列+树形dp)

D-Rebuild Tree Prufer 是这样建立的&#xff1a;每次选择一个编号最小的叶结点并删掉它&#xff0c;然后在序列中记录下它连接到的那个结点。重复n−2n-2n−2次后就只剩下两个结点&#xff0c;算法结束。&#xff08;为什么不是n−1n-1n−1次呢&#xff1f;因为第n−1n-1n−1…

牛客题霸 [ 求二叉树的层序遍历] C++题解/答案

牛客题霸 [ 求二叉树的层序遍历] C题解/答案 题目描述 给定一个二叉树&#xff0c;返回该二叉树层序遍历的结果&#xff0c;&#xff08;从左到右&#xff0c;一层一层地遍历&#xff09; 例如&#xff1a; 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3…

T183637-变异距离(2021 CoE III C)【单调栈】

正题 题目链接:https://www.luogu.com.cn/problem/T183637 题目大意 给出nnn个二元组(xi,yi)(x_i,y_i)(xi​,yi​)&#xff0c;求最大的 ∣xi−xj∣min{∣yi∣,∣yj∣}|x_i-x_j|\times min\{|y_i|,|y_j|\}∣xi​−xj​∣min{∣yi​∣,∣yj​∣} 1≤n≤2106,−106≤xi≤106,−…

dfs剪枝:洛谷P2809 hzwer爱折纸

传送门 解析 dfs暴力枚举即可 这题的重点是如何剪枝 不难发现&#xff0c;随着不断处理&#xff0c;纸条只会越来越短&#xff0c;且所有数字总加和不变 我一开始想到了2个条件&#xff1a; 1.当前长度比理想纸条小&#xff0c;return&#xff1b; 2.总加和与理想纸条不等&a…

2021牛客暑期多校训练营2 B-Cannon(组合+推式子)

B-Cannon 首先nnn个炮在一行操作一次的方案数为2(n−2)2(n-2)2(n−2):前面两个炮只能向右吃&#xff0c;最后两个跑只能向左吃&#xff0c;而其余的炮既可以向左也可以向右&#xff0c;于是有42(n−4)42(n-4)42(n−4)种 于是操作mmm次的操作排列的方案数为2m(n−2)(n−3)...(…

[译]聊聊C#中的泛型的使用

写在前面今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章&#xff0c;因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译&#xff0c;当然在翻译的过程中发现了一些问题&#xff0c;因此也进行了纠正&#xff0c;当然&#xff0c;原文的地址我放在最…