图论 —— 最短路

2024-06-17 19:48
文章标签 图论 短路

本文主要是介绍图论 —— 最短路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【概述】

最短路是图论中十分常见的一个问题,可分为单源最短路与全源最短路。

对于单源最短路来说,有时间复杂度为 O(E+VlogV) 要求权值非负的 Dijkstra,时间复杂度为 O(VE) 适用于带负权值的 Bellman Ford

对于全源最短路来说,有时间复杂度为 O(V*V*V) 的利用动态规划思想的 Floyd 算法,时间复杂度为 O(V*E+V*V*logV) 的基于 Dijkstra 的 Johnson 算法

具体算法内容详解:

  • Floyd 算法:点击这里
  • Dijkstra 算法:点击这里
  • Bellman Ford 算法与 SPFA:点击这里
  • Johnson 算法:点击这里

【例题】

1.Floyd

  1. Bus System(HDU-1690):点击这里
  2. 最短路(HDU-2544):点击这里
  3. Checking an Alibi(POJ-2394):点击这里
  4. 六度分离(HDU-1869):点击这里
  5. 信使(信息学奥赛一本通-T1376):点击这里
  6. 最短路径(信息学奥赛一本通-T1378):点击这里
  7. 最短路径问题(信息学奥赛一本通-T1342):点击这里
  8. 牛的旅行(信息学奥赛一本通-T1343):点击这里
  9. Shortest Path(HDU-5636):点击这里
  10. Restoring Road Network(AtCoder-3535):点击这里
  11. 最优乘车(信息学奥赛一本通-T1377)(输出流的应用+Floyd):点击这里
  12. Cow Hurdles(POJ-3615 )(最大值中的最小值):点击这里
  13. Fire-Fighting Hero(2019 ACM-ICPC 南昌赛区网络赛 B)(阅读理解+Floyd):点击这里

2.Dijkstra

  1. 最小花费(信息学奥赛一本通-T1344):点击这里
  2. 一个人的旅行(HDU-2066):点击这里
  3. 畅通工程续(HDU-1874):点击这里
  4. MPI Maelstrom(POJ-1502):点击这里
  5. Til the Cows Come Home(POJ-2387):点击这里
  6. Here We Go(relians) Again(HDU-2722):点击这里
  7. 炫酷路途(2019牛客寒假算法基础集训营 Day5-D):点击这里
  8. Honeycomb (Gym-102028F)(模拟建图+Dijkstra):点击这里
  9. A Walk Through the Forest(HDU-1142)(dfs搜索路径+Dijkstra):点击这里
  10. Silver Cow Party(POJ-3268)(双向最短路):点击这里
  11. The Battle of Guandu(HDU-5545)(多源多汇最短路):点击这里
  12. 齐头并进(51Nod-1649)(两次Dijkstra):点击这里
  13. 城市交通路网(信息学奥赛一本通-T1261)(Dijkstra+递归输出):点击这里

3.Bellman Ford

  1. 热浪(信息学奥赛一本通-T1379):点击这里
  2. 分糖果(信息学奥赛一本通-T1380):点击这里
  3. 城市路(信息学奥赛一本通-T1381):点击这里
  4. 最短路(信息学奥赛一本通-T1382):点击这里
  5. 香甜的黄油(信息学奥赛一本通-T1345):点击这里
  6. Skiing(POJ - 3037):点击这里
  7. zz's Mysterious Present(HDU-2145):点击这里
  8. In Action(HDU-3339)(01背包+SPFA):点击这里
  9. Telephone Linse(POJ-3662)(二分+SPFA):点击这里
  10. Destroying Roads(CF-302B)(SPFA 求任意两点最短路):点击这里
  11. すぬけ君の地下鉄旅行 / Snuke's Subway Trip(AtCoder-2069)(拆点建图+SPFA):点击这里
  12. Holy Grail(2019 ACM-ICPC 南京赛区网络赛 H)(建边+SPFA):点击这里

这篇关于图论 —— 最短路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070376

相关文章

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

poj 1502 MPI Maelstrom(单源最短路dijkstra)

题目真是长得头疼,好多生词,给跪。 没啥好说的,英语大水逼。 借助字典尝试翻译了一下,水逼直译求不喷 Description: BIT他们的超级计算机最近交货了。(定语秀了一堆词汇那就省略吧再见) Valentine McKee的研究顾问Jack Swigert,要她来测试一下这个系统。 Valentine告诉Swigert:“因为阿波罗是一个分布式共享内存的机器,所以它的内存访问

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

hdu 3790 (单源最短路dijkstra)

题意: 每条边都有长度d 和花费p,给你起点s 终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 解析: 考察对dijkstra的理解。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstrin

poj 3255 次短路(第k短路) A* + spfa 或 dijkstra

题意: 给一张无向图,求从1到n的次短路。 解析: A* + spfa 或者 dijkstra。 详解见上一题:http://blog.csdn.net/u013508213/article/details/46400189 本题,spfa中,stack超时,queue的效率最高,priority_queue次之。 代码: #include <iostream>#i

poj 2449 第k短路 A* + spfa

poj 2449: 题意: 给一张有向图,求第k短路。 解析: A* + spfa。 一下转自:http://blog.csdn.net/mbxc816/article/details/7197228 “描述一下怎样用启发式搜索来解决K短路。 首先我们知道A*的基础公式:f(x)=g(x)+h(x);对h(x)进行设计,根据定义h(x)为当前的x点到目标点t所需要的实际距

poj 3259 最短路负环

John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时间会倒退Ts。我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己。简化下,就是看图中有没有负权环。有的话就是可以,没有的话就是不可以了。 import java.io.BufferedReader;import java.io.InputStream;

POJ1724最短路

n个点,拥有总的价值money m条边(u,v,len ,cost),长度len,代价cost 求不超过money的代价条件下最短路。 public class Main {public static void main(String[] args) {new Task().solve();}}class Task {InputReader in = new InputReader

【AcWing】851. 求最短路

spfa算法其实是对贝尔曼福特算法做一个优化。 贝尔曼福特算法会遍历所有边来更新,但是每一次迭代的话我不一定每条边都会更新,SPFA是对这个做优化。 如果说dist[b]在当前这次迭代想变小的话,那么一定是dist[a]变小了,只有a变小了,a的后继(b)才会变小。 用宽搜来做优化,用一个队列,队列里边存的就是所有变小了的结点(队列里存的是待更新的点)。 基本思路就是我更新过谁,我再拿