
最短路问题
文章平均质量分 50
分享关于迪杰斯特拉、弗洛伊德、spfa、bellman等等最短路方面的算法题解和讲解
MangataTS
一个爱折腾的Coder
展开
-
L2-001 紧急救援(最短路)
题目链接https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840思路我们只需要在跑迪杰斯特拉最短路的时候注意一下松弛操作即可,我们定义 dis[i]dis[i]dis[i] 表示从起点 sss 到 iii 点的最短路径,sum[i]sum[i]sum[i] 表示从 sss 点到 iii 点的最多的救援队数量,cnt[i]cnt[i]cnt[i] 表示从 sss 点到 iii 点的最短路的条数,pre[i]原创 2022-03-20 22:32:41 · 2520 阅读 · 1 评论 -
算法小讲堂之最短路算法(Floyd+bellman+SPFA+Dijkstra)
前言如果你对图论相关知识一点也没有,那么建议您先去了解这些知识:https://acmer.blog.youkuaiyun.com/article/details/122310835,然后就可以快乐的学习最短路算法啦视频中绘图软件:https://csacademy.com/app/graph_editor/配套讲解视频:https://www.bilibili.com/video/BV1Fa411C7wX/如果哪里讲的有问题欢迎在评论区指出,感谢支持!一、Floyd算法1.1简介Floyd算法算是最简原创 2022-02-21 09:22:11 · 15691 阅读 · 16 评论 -
最短路计数(松弛操作处理)
题目链接https://www.luogu.com.cn/problem/P1144思路我们用一个ans数组存储我们从源点到当前点的路径条数,那么我们发现如果我们能进行松弛操作,我们当前的最短路路径就可以从上一个点继承过来即ans[j]=ans[t]ans[j]=ans[t]ans[j]=ans[t],如果不能进行松弛操作,那么我们查看是否和当前的最短路长度相等(当然这里的边权都是1不影响),如果相等的话那么我们就更新ans[j]ans[j]ans[j]的值即ans[j]=(ans[j]+ans[t]原创 2022-02-20 16:21:05 · 347 阅读 · 0 评论 -
P1629 邮递员送信(正反向建图 or 暴力)
题目链接https://www.luogu.com.cn/problem/P1629思路和农场派对这题一样,我们需要正反向建图,然后跑迪杰斯特拉然后再分别加上[2,n][2,n][2,n]的dis值(因为题目中保证了每个点可达),但是这道题可以直接对每个点跑迪杰斯特拉然后再吸一点氧暴力跑过去代码正反向建图#include<cstdio>#include<cstring>#include<queue>using namespace std;#define原创 2022-02-20 15:32:42 · 396 阅读 · 0 评论 -
AcWing 4247. 糖果(差分约束最短路)
题目连接https://www.acwing.com/problem/content/4250/http://poj.org/problem?id=3159思路假设第i个同学得到的糖果数量为a[i]a[i]a[i],然后第j个同学得到的糖果数位a[j]a[j]a[j]现在要求第j个同学的糖果数不超过a[i]+ka[i] + ka[i]+k个,也就是a[j]−a[i]<=ka[j] - a[i] <= ka[j]−a[i]<=k,那么我们要求的就是a[n]−a[1]a[n]-a[1]原创 2022-02-19 14:54:13 · 293 阅读 · 0 评论 -
AcWing 4246. 最短路径和(反向建图+链式前向星+堆优化)
题目连接https://www.acwing.com/problem/content/description/4249/http://poj.org/problem?id=1511思路其实这道题和农场派对这题是一样的,我们反向建边就能求出所有其他点到1这个点的距离,然后直接加上去就好了,但是不同的是这题的数据非常大,所以如果你是使用vector或者其他容器存储的话是会MLE的,所以我们这里手写链式前向星然后每次跑DJ的时候注意初始化就好了,下面放出两种写法的代码(第二种是MLE的)代码链式前向星原创 2022-02-19 13:37:54 · 378 阅读 · 0 评论 -
AcWing 4244. 牛的比赛(双向建图BFS)
题目连接https://www.acwing.com/problem/content/4247/http://poj.org/problem?id=3660思路通过观察样例我们可以发现一个事情,如果说当前的一个点顺着当前建的边走下去加上逆着走下去能覆盖所有的点,那么这个点的一个排名就确定了,为什么呢?我们来思考一下这个操作的含义:顺着当前建立的边走那么就是找到排名比自己小的人数有多少逆着当前建立的边走那么就是找到排名比自己大的人数有多少如果排名比自己大和比自己小的人数全部覆盖了,那么自己当原创 2022-02-19 12:50:52 · 193 阅读 · 0 评论 -
AcWing 4243. 传递信息(单源最短路)
题目连接https://www.acwing.com/problem/content/description/4246/http://poj.org/problem?id=1502思路没啥好说的就是一个裸的求单源最短路,只不过边的信息建立需要自己判断是否存在,范围在100以内,那么基本上所有的最短路都能过,我这里就给出迪杰斯特拉和Floyd的代码代码迪杰斯特拉#include<iostream>#include<cstring>#include<algorit原创 2022-02-18 22:08:05 · 272 阅读 · 0 评论 -
AcWing 4242. 货币兑换(SPFA or Bellman 判正权环)
题目连接https://www.acwing.com/problem/content/description/4245/思路根据题意我们可以知道,我们想求的是这个图中是否存在一个正权回路,让我们的钱变多了,那么我们建边的时候存储的信息就是终点v、兑换汇率r、服务费c,初始的时候我们有V这么多的S货币,那么我们就看其能转化为其他不同的货币使得下一个点的货币数量增加(一开始除了S点的货币为v其余初始化为小于等于0),那么最后如果某一个点更新了n次那么说明出现了一个正权环,使得我们的钱变多了,那么对于判断是原创 2022-02-18 21:21:12 · 564 阅读 · 0 评论 -
AcWing 904. 虫洞(SPFA or Djakarta or bellman判负环)
题目连接http://poj.org/problem?id=3259思路大概是想问我们能不能找到一个负环,那么再看一眼数据范围,500,感觉乱搞都能过,但是出题人很恶心啊,n的范围并不是500,卡了巨久,但是用Floyd也是能过的,只不过写的时候要注意自己的常数,常数打了就过不了了,但是想到判负环我们应该联想到spfa和bellman算法,详情请看:spfa和bellman判负环,由于spfa算法是优化后的bellman所以我这里就不放bellman的代码了代码Floyd算法#include&l原创 2022-02-18 17:09:25 · 255 阅读 · 0 评论 -
AcWing 1132. 农场派对(最短路反向建边)
题目链接https://www.acwing.com/problem/content/1134/思路我们想求所有点到x的距离以及x到所有点的距离,对于后者,我们直接对x跑一个最短路O(N2logn)O(N^2log_n)O(N2logn)范围内的算法都可以那么对于前者呢,如果正面去想我们肯定会想到直接跑N次最短路就好了,但是我们其实可以将有向边反建,然后再对x跑一次最短路,为什么这样就能算出来呢,因为你想我们从一个点iii到xxx的边如果反着建的话我们从xxx到iii的路径效果不就和iii到xxx正原创 2022-02-18 14:32:01 · 506 阅读 · 0 评论 -
AcWing 4241. 货物运输
题目连接https://www.acwing.com/problem/content/description/4244/思路这题其实和上一个青蛙这题很相似,传送门,我们知道青蛙求得是让1和n连通的最大路径最小,而我们这个货物运输要求的是最小路径最大,不就是反过来了吗,我们只需要将初始状态全部变为−INF-INF−INF,dis[0]dis[0]dis[0]变为INFINFINF,然后我们每次对点做松弛操作的时候其实就是dis[j]=max(dis[j],min(dis[t],k))dis[j]=max原创 2022-02-18 10:45:43 · 398 阅读 · 5 评论 -
AcWing 4240. 青蛙(最短路 or 最小生成树)
题目连接https://www.acwing.com/problem/content/description/4243/http://poj.org/problem?id=2253思路思路一(最短路)我们直接跑一个最短路就好,基本上所有的最短路都可以,然后注意的是我们在做松弛操作的时候,也就是判断是否应该加入我们的优先队列中的时候,我们做的不是一个加上这条边而是和这条边去一个max,也就是如果我们当前正在对起点t,终点j做一个松弛操作,那么我们做的不是dis[j]=max(dis[j],dis[t原创 2022-02-18 10:31:51 · 356 阅读 · 8 评论 -
AcWing 854. Floyd求最短路(模板)
题目链接https://www.acwing.com/problem/content/856/思路我们用d[k][i][j]来表示经过前k个点中,或者说以前k个点作为中转更新从i到j最短路,那么我们就能得到一个状态转移方程d[k][i][j]=min(d[k−1][i][j],d[k−1][i][k]+d[k−1][k][j])d[k][i][j] = min(d[k-1][i][j],d[k-1][i][k] + d[k-1][k][j])d[k][i][j]=min(d[k−1][i][j],d原创 2022-02-10 11:25:35 · 239 阅读 · 0 评论 -
AcWing 852. spfa判断负环(spfa or bellman)
题目链接https://www.acwing.com/problem/content/description/854/思路思路一我们定义一个数组cnt,cnt[i]表示i这个点被更新的次数,那么如果一个点被更新了大于等于n次,那么就说明有负环,然后直接跑SPFA在更新的时候记录更新次数即可思路二之前学的bellman_ford算法我们迭代了n次,其实如果不存在负环的话我们实际上不用迭代n次,迭代n-1次就好了,如果第n次迭代还更新了,那么就说明有负环代码#include<bits/st原创 2022-02-10 11:24:30 · 198 阅读 · 0 评论 -
AcWing 851. spfa求最短路(解决负边权最短路)
题目链接https://www.acwing.com/problem/content/853/思路就是SPFA求最短路的模板,其思路大概是我们要更新所有能被松弛的边,然后更新松弛的边的边,然后就类似BFS的方式逐步更新代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000007#defi原创 2022-02-10 11:23:34 · 246 阅读 · 0 评论 -
AcWing 853. 有边数限制的最短路(bellman的k边限制最短路)
题目链接https://www.acwing.com/problem/content/855/思路思路其实利用了bellman_ford算法的特点,之前还没注意过,我们在第一层循环限制每个点可以限制松弛的边的长度,所以对于对边无特殊限制(本题有)的直接循环n次即可,那么我们这里的限制是k,并且注意,在每次松弛前我们要对上一个状态进行记录,然后用上一个状态进行更新,因为如果是使用当前的状态更新的话就会造成一个问题,“串联更新”,这样的话我们的边数限制就没了作用,详情请看代码代码#include<原创 2022-02-10 11:23:00 · 244 阅读 · 0 评论 -
AcWing 850. Dijkstra求最短路 II(Dijkstra稠密图堆优化模板)
题面链接https://www.acwing.com/problem/content/description/852/思路和朴素版的Dijkstra类似,只不过我们对边的存储进行堆优化,优先将短的边先更新(基于贪心策略)代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000007#def原创 2022-02-10 11:21:08 · 356 阅读 · 0 评论 -
AcWing 849. Dijkstra求最短路 I(稠密图Dijkstra模板)
题面链接https://www.acwing.com/problem/content/851/思路我们从源点开始找,然后我们将这个点所有指向的点,然后以这个点为中心点看是否能更新其距离,最多更新n次后就能将单元最短路求出代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000007#de原创 2022-02-10 11:16:55 · 234 阅读 · 0 评论