![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
单源最短路径
ITCharge
高效率编程,慢节奏生活。
展开
-
POJ1860 Currency Exchange【BellmanFord算法】【求正权回路】
题目大意:有N种货币,货币之间可以按汇率交换,同时还需要收手续费,当你用100A货币去交换B货币,假如A到B的汇率为29.75,手续费为0.39,则你可以得到(100-0.39)*29.75 = 2963.3975的B货币。货币可以一直重复交换,问:能否通过兑换货币之后,增加你手中货币的价值,则输出"YES",否则输出"NO"。思路:把N种货币看成图上的N个点,当你有数量为V的货币A时,货币AB之间的权值就是——(V-手续费)*A到B的汇率这道题就可以转换为求图是否还有可无限增大(含有正权回路)的原创 2015-01-06 23:09:47 · 1177 阅读 · 0 评论 -
POJ2394 Checking an Alibi【Dijkstra】
题目大意:有F个农场,标号为1~F。1号农场为谷仓。有C头奶牛在这些农场上,他们喜欢偷吃谷子,但是在偷吃谷子前M秒,有个摄像头会将它们的位置记录下来。各个农场之间有P条通路,并且知道这P条路的行走世间。如果奶牛可以在M秒之内赶到谷仓,就可以偷吃到谷子。问:有多少奶牛可以偷吃到谷子,并升序输出它们的序号。思路:最短路径问题。用Dijkstra算法求出1号谷仓到各个农场的最短时间,然后看奶牛所在的农场到谷仓的时间是否小于等于M,如果小于等于则存入结果数组ans[]中。原创 2015-04-16 21:06:56 · 966 阅读 · 0 评论 -
POJ2387 Til the Cows Come Home【Dijkstra】
题目大意:给你N个点,M条双向边,现在站在结点1上,问从结点1到结点N的最短路径为多少思路:求单源最短路径,这道题边权值范围为1~100,没有负边,直接用Dijkstra来做就可以了。不清楚是否有重边,这里我是做了处理。原创 2015-01-25 22:23:13 · 892 阅读 · 0 评论 -
POJ3114 Countries in War【强连通分量】【最短路径】
题目大意:间谍在战争期间想要传递一份谍报回国,谍报可以在邮局之间传递,但这种传递是单向的,并且会小号一些时间。但是如果两个邮局在同一个国家的话,那么谍报在这两个邮局之间传递是不消耗时间的,可以立即到达。如果几个邮局发出的谍报可以通过一些路径相互到达,那么这些邮局就属于一个国家。那么问题来了:给出一个起点和终点,问最快什么时候能够将谍报传递到。思路:本题求得是有向图上的最短路。以邮局为点,从一个邮局到达另一个邮局的时间为边权,但是这里的边权分两组:相同国家的邮局之间的边权和不同国家的邮局之间原创 2015-02-14 21:19:44 · 1087 阅读 · 0 评论 -
HDU1874 畅通工程续【Dijkstra】
题目大意:给你N个点,M条双向边。再给你起点s和终点t,求点s到点t的最短路径。思路:求一对顶点之间的最短路径。用Dijkstra算法来做。这道题需要注意的几点:(1)注意重边情况;(2)注意s == t的情况,输出为0;(3)标记k的时候,初始化千万不能标记成0~N-1。原创 2015-01-25 17:50:28 · 995 阅读 · 0 评论 -
POJ3592 Instantaneous Transference【强连通分量】【最长路】
题目大意:有一个N*M的矩阵地图,矩阵中用了多种字符代表不同的地形,如果是数字X(0~9),则表示该区域为矿区,有X单位的矿产。如果是"*",则表示该区域为传送点,并且对应唯一一个目标坐标。如果是"#",,则表示该区域为山区,矿车不能进入。现在矿车的出发点在坐标(0,0)点。并且(0,0)点一定不是"#"区域。矿车只能向右走、向下走或是遇到传送点的时候可以传送到指定位置。那么问题来了:矿车最多能采到多少矿。思路:如果把N*M个矩阵单位看做是N*M个点,编号为0~N*M。然后从一个坐标到另一个原创 2015-02-11 20:46:08 · 1940 阅读 · 1 评论 -
HDU2066 一个人的旅行【Dijkstra】
题目大意:给你T条路的图,和S个起点和D个终点,问从S个起点中某个起点,到D个终点中的某个终点的最短路径是多少。思路:遍历起点S和终点D,用Dijkstra算法求单源最短路径即可。原创 2015-01-02 22:24:57 · 1132 阅读 · 0 评论 -
HDU3790 最短路径问题【Dijsktra算法】
题目大意:上边说的很清楚了,边之间多了花费。求图中两点间的最短路径,如果最短路径有多个,输出花费最少的那个。思路:Dijkstra算法来求单源最短路径,在更新路径的时候如果距离相等,则更新花费。最后注意输入的时候判断下,避免重边。原创 2015-01-02 21:40:59 · 1273 阅读 · 0 评论 -
HDU2544 最短路【Dijkstra算法】
题目大意:给你N个结点和M条路,接下来是M条路,A B W表示结点A到节点B权值为W。然后从节点1出发,问到节点N的最短路径长为多少。思路:求单源最短路径,用Dijkstra算法来做。Dijkstra算法:将所有点分为两个集合。如果源点s到u的最短路径已经确定,点u就属于集合V1,否则属于集合V2。1.将源点s到图中各点的直接距离当做初始值记录为s到各点的最短距离,不能到达的记为INF。S到S距离为0。2.在集合V2中的点中找一个点u,使得源点s到该点u路径长度最短,将u从V2中除去,加到原创 2015-01-01 23:17:23 · 1216 阅读 · 0 评论 -
POJ3259 Wormholes【BellmanFord】
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;const int MAXN = 550;const int MAXM = 5500;const int INF = 0xffffff0;struct EdgeNode{ int to; int w; int next;}Edges[MAXM];int Head[MAXN],Dist[原创 2015-01-07 11:09:32 · 987 阅读 · 0 评论 -
POJ1511 Invitation Cards【SPFA】
题目大意:给你N个结点和M条边。问:从结点1出发分别到2、3、4、…、N结点的路程以及从这些结点返回结点1的总路程和。思路:求源点到各结点的距离问题,用Bellman-Ford时间复杂度为O(N*M),这道题的数据规模是1000000,所以果断不行。我用了链式前向星(类似邻接表)存储图,因为要分别求出去时的最短总路程和回来时的最短总路程,所以用了二维的链式前向星,一个存正边,一个存反边,然后以结点1为起点,对正边做一次SPFA算法,再以结点1为起点,对反边做一次SPFA算法。看讨论区貌似有人用g原创 2015-01-25 11:03:14 · 1294 阅读 · 0 评论 -
单源最短路径Dijkstra、BellmanFord、SPFA【模板】
Dijkstra算法: 将所有点分为两个集合。如果源点s到u的最短路径已经确定,点u就属于集合Va,否则属于集合Vb。 1.将源点s到图中各点的直接距离当做初始值记录为s到各点的最短距离,不能到达的记为INF。S到S距离为0。 2.在集合Vb中的点中找一个点u,使得源点s到该点u路径长度最短,将u从Vb中除去,加到V1中。这时候求出了当前S到u的最短路径。 3.把新确定的点u更新s到集合Vb原创 2015-05-04 19:20:43 · 1059 阅读 · 0 评论