在 Prim 算法中使用 pb_ds 堆优化 Prim 算法用于求最小生成树(Minimum Spanning Tree,简称 MST),其本质是一种贪心的加点法.对于一个各点相互连通的无向图而言,Prim 算法的具体步骤如下: 令 \(G=(V,E)\) 表示原图,\(G'=(V',E')\) 表示 \(G\) 的最小生成树,\(dis_u\) 表示节点 \(u\) 到任意 \(v \in V'\) 的最小距离(初始化为 \(+\infty\)). 任取节点\(s \in V\),令 \(di…
昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外给出邻接表存储实现的操作,唉,真是令人窒息...... 言归正传吧,毕竟我这么菜,也不会讲什么大道理...... 呜哇呜哇.jpg 原题链接 本题大意:给定n结点,a和b表示其中的两个结点,输出t组a和b和w表示a和b距离w可以互相抵达,求从n走到1的最短路径... 本题思路:建图之后直接单源最短路…
一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算法 思维 本质上是贪心的思想,声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:S,原本的元素构成集合Q,初始时,原点 s 的路径权重被赋为 0 (dis[s] = 0).若对于顶点 s 存在能直接到达的边(s,m),则把dis[m]设为w(s, m),同时把…
Dijkstra算法 由于我之前一直记的迪杰斯特拉的翻译导致我把dijkstra写成了dijstra--所以下文#define dijstra dijkstra 我以后叫她迪杰克斯歘! Dijskra是用来在有向图或者无向图中寻找任意两个点的最小距离的算法.它相较于spfa不会死掉(spfa死了),但是无法处理带负环的图和求最长路(除非加上一些奇怪的东西,我们这里是新手村不予讨论我不会) Dijskra的核心思想是先把所有边的边权进行从小到大的排序,再建一个记录起点到各个点的距离的dis数组并初…
<题目链接> 题目描述 给定一个 N 个点, M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入格式: 第一行为三个正整数 N,M,S . 第二行起 M 行,每行三个非负整数 ui, vi, wi,表示从 ui到 vi​ 有一条权值为 wi​ 的边. 输出格式: 输出一行 N 个空格分隔的非负整数,表示 S 到每个点的距离. 1<=N<=100000 1<=M<=200000 解题分析: 由于n和m的数据太大,所以…
关于堆优化 传统\(Dijkstra\),在选取中转站时,是遍历取当前最小距离节点,但是我们其实可以利用小根堆(STL的priority_queue)优化这个过程,从而大大降低复杂(\(O(V2+E) -> O((V+E)lgV)\)) 另外,需要注意,因为\(Dijkstra\)本质是贪心,每一次选择中转站必须保证最优,而负边权会使当前中转站不为最优,所以不能处理含有负边权的图 代码 #include <cstdio> #include <queue> #include &…
先附上一个例题:P3371 [模板]单源最短路径 一眼扫去,最短路... spfa可行,但是今天的主题是Dijkstra: #include<iostream> #include<algorithm> #include<cstdio> #define MAXN 10010 #define MAXM 500010 #define MAX 999999999 using namespace std; int n,m,s,c=1; int head[MAXN],path[MA…
POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意:  圣诞树是由n个节点和e个边构成的,点编号1-n.树根为编号1,选择一些边.使得全部节点构成一棵树.选择边的代价是(子孙的点的重量)×(这条边的价值). 求代价最小多少. 分析:  单看每一个点被计算过的代价,非常明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 只是坑点还是非常多的. 点的数量高达5w个,用矩阵存不行.仅仅能用边存.…
朴素Dijkstra #include<bits/stdc++.h> using namespace std; const int inf=9999999; bool book[105]; int mp[105][105]; int dis[105]; int n,m; void Dijkstra(int s){ int start=s; memset(dis,inf,sizeof(dis)); book[s]=1; for(int i=1;i<=n;i++) dis[i]=min(di…
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: 说实话,上次写类似的二维状态最短路Gym 101873C - Joyride - [最短路变形][优先队列优化Dijkstra],我没能把手写二叉堆优化Dijkstra的给写出来. 这次费了点功夫,也算是给写出来了,需要注意的点还是有点多的.而且我终于深刻理解为啥不推荐手写二叉堆了,主要是代码量相比…