堆优DIJ模板】的更多相关文章

Dij:贪心思想的单源最短路,时间复杂度O(n^2). Dij算法流程: d数组记录源点s到每个点的距离,若无边则设为inf,标记源点: 选出d数组中未标记的最小值,该节点记为k,并标记k为已求出最短路: 枚举每个节点(记为j),若经过k到达j的路径<d[j]且未标记,则更新d[j]; 重复2.3步n次: d[v]为s-v的最短路: 堆优Dij:即用堆优化的dij算法,时间复杂度O(nlogn);(但是据说跑起来比spfa快?求神犇解释) 堆优Dij算法流程: q为priority_queue,…
B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路,已知每天每条道路两个方向的人流量,即沿着该方向通过这条道路的人数.每一个交叉路口都有不同的海拔高度值,每向上爬h的高度,就需要消耗h的体力.如果是下坡的话,则不需要耗费体力.已知城市西北角的交叉路口海拔为0,东南角的交叉路口海拔为1(如上图所示),但其它交叉路口的海拔高度都无法得知.小Z想知道…
Koala and Notebook 题目链接:https://codeforces.com/contest/1209/problem/F 数据范围:略. 题解: 开始的时候看错题了....莫名其妙多了一道好题嘻嘻嘻 这个题非常诡异,就是把所有的边连在一起写下来. 所以我们把边权按照每一位建一个点然后拆开,保证每条边都是有向边而且边权是个位数. 然后我们按照图的样子,边权都设为$1$跑一遍堆优化$dij$,因为数的大小比较不是字符串,长串绝对比短串大. 然后我们取出所有的有向边,满足$dis_u…
Frog Jumping 题目链接:http://codeforces.com/contest/1146/problem/D 数据范围:略. 题解: 首先发现,如果$x\ge a +b$,那么所有的$Num | gcd(a,b)$都可以取到. 这是显然的因为我们可以保证最右端点在$a+b$内. 那么我们只需要考虑小于$x$的部分. 可以暴力建边,跑出当前点需要的最右端点的最小值,用spfa或者堆优化dij都行. 代码: #include <bits/stdc++.h> #define N 10…
就是短 感谢Cptraserdalao的博客 #include<bits/stdc++.h> using namespace std; struct node { int val,num; bool operator <(const node &x) const { return val>x.val; } }; priority_queue <node> dij; vector < pair<]; ],done[]; //dist存储边权,done记…
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> #include<set> #include<queue> #include<algorithm> #include<vector> #include<map> #in…
题目描述 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 每次经过一个城市,都会被收取一定的过路费(包括起点和终点).路上并没有收费站. 假设1为暴风城,n为奥格瑞玛,而他的血量最多为b,出发时他的血量是满的. 歪嘴哦不希望花很多钱,他想知道,在可以到达奥格瑞玛的情况下,他所经过的所有城市中最多的一次收取的费用的最小值是多少. 题目分析 题目说了那么多,其实就是让求在角色不死亡的情况…
#include<iostream> #include<cstdio> #include<queue> using namespace std; ],head[],tree[],val[]; ]; ]; struct cmp { bool operator()(int a,int b) { return dis[a]>dis[b]; } }; priority_queue<int,vector<int>,cmp> Q; void add(i…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意:给你一个有向图,然后给你k个点,求其中一个点到另一个点的距离的最小值. 解法:枚举二进制位按照标号当前位为1 和当前位为0分为两个集合,每次求解两个集合之间的最短路即可覆盖到所有的点对.时间复杂度20*dijstla时间,这样做的正确性在哪?显然我们需要的答案至少有一个二进制位不同,那么这样求解肯定可以找到正确答案,事实上还可以随机分组emmmm... #include <bits/st…
题目连接:https://www.luogu.org/problemnew/show/P3377 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 300001 + 10; struct Left_Tree{ int val, fa, son[2], dis; }h[maxn&l…