
最短路问题
文章平均质量分 55
Brightess
毕业于湖南城市学院
目前在某游戏大厂搬砖(
展开
-
AcWing 1137. Choose the best route(朴素dijkstra反向建图 or 虚拟源点法)
法一、二都是用的朴素dijkstra算法法一:反向建图 求终点n到每个起点的最短距离 O(T * (n^2 + n))#include <bits/stdc++.h>using namespace std;const int N = 1010, M = 2e4+10;#define inf 0x3f3f3f3fint g[N][N], dist[N];bool st[N];int n, m, s;int w;int W[N];int dijk(int s){ ...原创 2022-02-24 21:57:44 · 401 阅读 · 0 评论 -
AcWing 342. 道路与航线(spfa SLF优化)
普通spfa最坏情况O(nm),会被本题卡。我找到一个spfa优化的做法。SLF(Small Label First) 双端队列优化,也被戏称为“酸辣粉优化”优化思路:将原队列改成双端队列,对要加入队列的点 p,如果 dist[p] 小于队头元素 u 的 dist[u],将其插入到队头,否则插入到队尾。不推荐,因为y总说这是对数据做优化,但竞赛的时候是不知道数据的,想卡还是会被卡。因此正解是做法二下面是做法一(spfa SLF优化 可以AC本题)#include<bits/stdc++...原创 2022-02-24 18:34:46 · 208 阅读 · 0 评论 -
AcWing 341. 最优贸易(spfa + dp)
前置理论:在题解这道题之前先讲一下 dp和最短路的关系。其实最短路和dp的交集是很大的。dp问题运用集合分析完之后,把所有的方案归为若干类之后,每一类都用dp[i, j]状态表示(我们以二维为例子),我们将每一个状态看做图当中的一个点,如果dp[i, j]可以由某个状态更新的话,如背包问题中的:dp[i, j] = max(dp[i-1, j], dp[i-1, j-vi] + wi),dp[i, j]这个状态点可以由dp[i-1, j]和dp[i-1, j-vi]两个状态点转移而来,且边权重一条是原创 2022-02-24 18:19:40 · 235 阅读 · 0 评论 -
AcWing 340. 通信线路(第k+1大值最小 二分答案 + 堆优化dijkstra)
题意:求一张无向图上 所有从 1→n 的路径中,第 k+1 大的边权的最小值。题意:首先考虑暴力怎么做:搜出所有路径再找最小值,但我们发现数据规模太大,做不了。于是我们可以从最小值入手,也就是采取二分答案,利用二分将这个值求出来。题目中给出边权的最大值是1e6,我们将二分的区间范围定为[0, 1e6+1]假设我们二分出一个值x,那意味着x应该满足:从 1→n 的路径中应该存在一条路,使得这条路上 最多有 k 条大于x的边。(二分值需要满足的属性)那么如何刻画这个属性呢?可以着眼于图上的边权是原创 2022-02-23 22:01:49 · 633 阅读 · 0 评论 -
堆优化Dijkstra算法求最短路 并输出最短的路径
#include<bits/stdc++.h>using namespace std;const int N = 1010, M = 2e4+10;typedef pair<int, int> pii;#define x first#define y second#define inf 0x3f3f3f3fint dist[N], h[N], e[M], ne[M], w[M], idx;bool st[N];int n, p, k;int Prev[N];原创 2022-02-23 19:46:05 · 531 阅读 · 0 评论 -
朴素dijkstra算法 :AcWing 849. Dijkstra求最短路 I
Dijkstra算法(适用于稠密图)Dijkstra算法的流程如下:dijkstra算法片段:int dijkstra()//求出了每个点到起点的最短距离{ memset(dist,0x3f,sizeof dist);//除1号节点之外,其余均初始化为无穷大 dist[1]=0; for(int i=0;i<n;i++)//i下标从0开始意在提醒这仅表示n次迭代,每一次寻找不在s中距离最近的点t { int t=-1;//便于更新第一个点原创 2022-02-20 17:08:47 · 698 阅读 · 0 评论 -
堆优化版dijkstra算法:AcWing 850. Dijkstra求最短路 II
堆优化版dijkstra算法分析:朴素版dijkstra的时间复杂度为O(n^2),主要瓶颈在于第1步的寻找全局最小值的过程。可以用小根堆(C++STL priority_queue)对dist数组进行维护,用O(logn)的时间获取最小值并从堆中删除,用O(logn)的时间执行一条边的扩展和更新。因此最终我们可在 **O(m logn)**的时间”内实现 Dijkstra算法。该算法适用于稀疏图,非负权边图。代码片段:int dijk(){ memset(dist, 0x3f原创 2022-02-20 17:55:59 · 636 阅读 · 0 评论 -
Bellman-Ford算法:AcWing 853. 有边数限制的最短路
Bellman-Ford算法分析:给定一张有向图,若对于图中的某一条边 (x, y,z),有 dist[y] ≤dist[x]+z成立,则称该边满足三角形不等式。若所有边都满足三角形不等式,则dist数组就是所求最短路。我们先介绍基于迭代思想的Bellman-Ford 算法。它的流程如下:1.扫描所有边(x, y,z),若dist[y] > dist[x]+z,则用dist[x]+z更新dist[y]。2.重复上述步骤,直到没有更新操作发生。Bellman-Ford算法的时间复杂度为O(原创 2022-02-20 18:40:17 · 429 阅读 · 0 评论 -
SPFA算法:AcWing 851. spfa求最短路
SPFA算法分析:SPFA算法实际上是“队列优化的Bellman-Ford 算法”。SPFA 算法的流程如下:1.建立一个队列,最初队列中只含有起点1。2.取出队头节点x,扫描它的所有出边(x,y,z),若dist[y] > dist[x]+z,则使用dist[x]+z更新 dist[y]。同时,若y不在队列中,则把y入队。3.重复上述步骤,直到队列为空。在任意时刻,该算法的队列都保存了待扩展的节点。每次入队相当于完成一次 dist数组的更新操作,使其满足三角形不等式。一个节点可能会原创 2022-02-20 20:34:11 · 743 阅读 · 0 评论 -
AcWing 852. spfa判断负环(抽屉原理)
思路:运用 SPFA算法 结合 抽屉原理 判断图中是否存在负环时间复杂度:O(nm) n 表示点数,m 表示边数代码:#include<iostream>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int N = 2000+10;const int M = 10000+10;#define inf 0x3f3f3f3fi..原创 2022-02-20 20:58:11 · 527 阅读 · 0 评论 -
Floyd算法:AcWing 854. Floyd求最短路
Floyd算法分析:为了求出图中任意两点间的最短路径,当然可以把每个点作为起点,求解N次单源最短路径问题。不过,在任意两点间最短路问题中,图一般比较稠密。使用 Floyd算法 可以在 O(N^3) 的时间内完成求解,并且程序实现非常简单。设d[k,i,j]表示“经过若干个编号不超过k的节点”从i到 j的最短路长度。该问题可划分为两个子问题:经过编号不超过k-1的节点从i 到 j,或者从i先到k再到j。于是:d[k,i,j]= min(d[k-1,i,j],d[k-1,i,k]+d[k-1,k,j原创 2022-02-20 21:17:10 · 473 阅读 · 0 评论 -
AcWing 1129. 热浪(朴素dijk、堆优化dijk、bellman_ford、spfa求无向图最短路)
题意:给你点数、边数、起点、终点,哪些边,让你求起点到终点最短路径。是一道很适合拿来练手的纯裸模板题。思路:本题数据范围:1≤T≤2500,1≤C≤6200,朴素dijk、堆优化dijk、bellman_ford、spfa算法都可以过,选一个自己喜欢的即可,注意 该图是无向图。下面用四个方法解决这道题。朴素版dijkstra做法 O(n^2)#include<bits/stdc++.h>using namespace std;int T, C;#define inf 0...原创 2022-02-21 19:28:05 · 416 阅读 · 0 评论 -
AcWing 1128. 信使(floyd 广播模型)
题意:如题。思路:本题实际上是一个广播模型,初始时指挥部将一条广播发出去,它会向所有与它连有边的节点传输广播,每个节点接收到信息以后又会向与各自连有边的节点发出广播,同时每个节点都是会反向广播的(无向边)。题目问的是:整个网络的所有节点都接到信息一共需要多少时间?我们先考虑一下对于每个节点接收到指挥部的信息需要多少时间:从指挥部到当前点的每一条路径都会成为一个广播的途径,那么当前点第一次接收到广播的时间显然就是所有路径中最短的那个(即指挥部到当前点的最短距离)。因此本题核心在于:对于每个点...原创 2022-02-21 20:55:12 · 639 阅读 · 0 评论 -
AcWing 1127. 香甜的黄油(循环跑堆优化dijkstra)
题意:p个顶点c条正权边,每个点有若干个奶牛在1-p号点里面找一个点,使得所有点里面的奶牛到这个点的距离和最小思路:一道最短路的升级应用,根据题意, 我们需要找到一个距离所有牛最短的牧场。那么只需要枚举所有牧场为起点,求此时所有其他牧场到它的最短路之和即可。然后输出所有牧场中最短距离即为答案。先看数据:点数800,边数1450*2(无向图),每个点跑一次。多源最短路,先想Floyd、bellman_ford 和 朴素版dijkstra ,算一算会超时。然后就是堆优化版dijkstra和s...原创 2022-02-21 23:34:16 · 599 阅读 · 0 评论 -
AcWing 1126. 最小花费(朴素dijkstra变式)
题目描述在n个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。输入格式第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数。以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费 (z<100)。最后一行输入两个正整数A,B。数据保证A与B之间可以直接或间接地转账。输出格式输出A使得B到账100元最少需原创 2022-02-22 09:44:21 · 227 阅读 · 0 评论 -
AcWing 920. 最优乘车(建图,特殊处理输入,bfs求最短路)
题意:给定路线数m,站点数n,m条单程路线会经过哪些站点,问从起点1到终点n****最少要换乘几次。思路:换乘多少次 可以转换为 乘坐过多少次车减1步骤:1、在同一条路线中,任意一个 在此路线上的车站 均能 沿着该路线的方向 到达后面的车站,权值都是1,表示 只乘坐一次车。解释:以样例 4 7 3 6 为例,分别将 4 ~ 7、4 ~ 3、4 ~ 6、7 ~ 3、7 ~ 6、3 ~ 6 连一条边,权值为 1:表示从 车站4做到 车站7 只要乘一次车,表示从 车站4 做到 车站3 只..原创 2022-02-22 20:29:15 · 398 阅读 · 0 评论 -
AcWing 1135. 新年好(堆优化dijkstra打表 + dfs)
题意:规定起点为1号点,主角要求从起点出发,必须要经过其它5个点(这5个点的编号任意),且这 5个点的 经过顺序不唯一,问 主角总行程的最小值 是多少?图中的节点当然不仅仅只是上面所说的6个点,注意上的所有节点都是联通的,而且节点之间的边是无向边。思路:拿到一个题目并思考运用什么算法的时候,我们首先最要关心的是时间复杂度。我们先想想暴力怎么做,我们可以先爆搜枚举所有摆放的顺序,一共有5个需要经过的节点,因此就会有5!种拜访的顺序。(由于起点1号点是固定的,我们dfs爆搜顺序实际上是搜索2~...原创 2022-02-23 12:12:44 · 516 阅读 · 0 评论