最短路算法及其一些应用
文章平均质量分 77
qte_acm
这个作者很懒,什么都没留下…
展开
-
poj 1860 最短路
题目大意:给你多个货币交换点,每次从一个货币到另一个货币的都会产生手续费和汇率,现在给你一个确定的货币和这个货币的数量,问你,通过交换,最后再返回题目给出的那个确定的货币,如果货币数量增加了则输出yes否则输出no。 注意:1、只能用double如果用其他会出现精度问题。 这个题目的关键点在于反向用mellman_ford。代码:#includeusing namespace std原创 2013-12-14 20:01:46 · 690 阅读 · 0 评论 -
poj 2570 floyd算法+二进制的应用
题意:有n个网络站点 , 这些站点有一些是连接 , 但是这些连接是不同的公司建造的 , 每个公司用一个小写字母表示 ,每对连接后面跟着一个字符串 , 表示这些公司都有这两个站点之间的连接网络 , 下面就有一些,查询操作 , 给出两个站点 ,有你输出哪些公司在这两个站点间有自己网络。解法:由题意我们知道 , 最多只有26个公司 , 那么我们就用一位二进制表示一个公司 ,那么再求两个站点间有原创 2013-12-14 20:05:26 · 595 阅读 · 0 评论 -
poj 1734 Floyd算求有向图的最小环
题意:旅游公司要开发一条新的路线 , 要求这是一个总路程尽可能短的环 , 并且不能只含两个城市 , 除开起点外 ,不能重复走之前走过的城市 , 输出这条路线?Floyd算法求最小环代码://用floyd算法 , 求有向图的最小环#include#include#include#includeusing namespace std;#define INF 0xffffff原创 2013-12-14 20:05:28 · 2428 阅读 · 0 评论 -
poj 2983 中等的差分约束
对于差分约束题目的关键在于怎么找到问题约束的条件,这也是难点对于本题主要有两个条件:1. 边长确定,即xi - xj = b; 可以转化成 xi -xj =b (即 xj - xi 2. 边长不定,xi - xj >= 1; 可以转化成 xj - xi 再通过这两个条件建图 , 然后再用SPFA算法就行了 , 由于我们所建的图不一定是一个连通图 , 所以我们加一个源点 , 这个原创 2013-12-14 20:05:32 · 614 阅读 · 0 评论 -
poj 3159 差分约束+最短…
这题的题意比较难懂 , 我看了很久一直都没懂什么意思。题意:有一批糖果要由班长flymouse分发给班里的小朋友,给出m对数据u,v,w,表示第v个小朋友最多比第u个小朋友多w个,但flymouse与snoopy不和,所以在满足上述约束的条件下,flymouse要尽量比snoopy多。snoopy标号1,flymouse标号n解法:根据题目给出的不等以建立一个图 , 然后求从点1 到点原创 2013-12-14 20:05:35 · 616 阅读 · 0 评论 -
hdu 4725 有点深度的最短路
题意:有n个点 , m条无向边 , 每条边都是有权值 , 并且 , 每个点属于一个楼层 , 相同楼层之间可以通过 , 但是要花费 c, 求 1 到 n的最小花费。解法:刚开始做得时候 , 我是直接把两个相邻楼层之间的点建立一条无向边 , 权值为c , 但是一直TEL , 一开始一直不明白是为什么, 看了大牛的代码是通过把每个点拆成3个点来做 , 一开始也没明白 , 为什么我这么做会超时 ,原创 2013-12-14 20:06:32 · 651 阅读 · 0 评论 -
uva 10603 状态压缩& 最短路
题意:有3个杯子 , 每个杯子的容量分别为: a 、 b、 c , 前两个杯子都是空的 , 第三个杯子的满的 , 问 ,让任意一个杯子中有确定L升水 , 最少需要倒多少升水。解法: 其实这个题目可以看成是一个隐式图搜索的问题 , 直接用dfs就能解决 , 这里用最短路 , 那么我们就要先把图建立好 ,(a,b)这表示一个状态 , 那么我们把每个这样的状态看成是一个点 , 建图时 , 就判断原创 2013-12-14 20:06:37 · 658 阅读 · 0 评论 -
poj 3259 最短路(带负环)
题目的意思是:给出农场的路线图, 并且存在风洞(经过风洞所需的时间为负的) , 问你从一个农场出发,经常其他路线和风洞 ,能不能存在一条路线,使你返回到原点的时候,所花的时间为负的,也就是问你所给的图中是否存在负权环。注意:1、本题中存在重边的数据。 本题有三中解法 1、mellman_ford 2、SPFA 3、深搜或则宽搜 这里只给出解法1和2的代码: 1:#incl原创 2013-12-14 20:01:43 · 937 阅读 · 0 评论 -
poj 2253 dijkstra
题意:一只青蛙要通过在石头间的跳跃到达一个地方 , 求跳跃宽度的最大最小值?关键在于 , 思考出宽度和距离的相同之处我们只需要把距离变成每天路径上的最大宽度就行 , 然后在用dijkstra求出每个点的最小宽度代码:#include#include#include#includeusing namespace std;#define INF 0xfffffff#defi原创 2013-12-14 20:05:18 · 583 阅读 · 0 评论 -
uva 10269 最短路+dp
题意:有a个村庄、b个城镇, 编号分别为:1—a , a+1——a+b 。 有双神奇的鞋,可以瞬时移动,可以使用k次,每次可以移动L , 但穿这双鞋的时候,不能经过城镇 , 问:从a+b 到 1 最短距离是多少?刚开始看这个题时 , 一点思路都没有 , dp类型的题目做得太少了。解法:进行状态压缩, 用点+使用鞋子的次数 , 来表示一个状态 , d[i][k] , 表示到原创 2014-05-02 21:16:55 · 1157 阅读 · 0 评论 -
uva 11280 状态压缩+最短路
题意:坐飞机从 a 地到 b 地 ,在最多停留s次时 , 最小花费是多少?在题目给出的地点 , 是按从远到近给出的 , 并且给出的航班中 , 不会有从远地点到近地点的航班。因此从这可以看出 , 题目给的图是一个DAG图 , 那么我们就能用toposort来找最短路。注意: 会有重边解法:构造一个数组 d[i][j] , 表示从开始点 s 到点 i原创 2014-05-04 15:28:12 · 990 阅读 · 0 评论 -
uva 11367 dijkstra+dp状态压缩
题意:给出n个地点 和 每个地点的油价 ,有 m 条边 , 并给出每条边长度 。1单位汽油可以走1千米 , 油箱的容量为 c , 在初始点 s 时 , 油箱中的油为 0 , 求s 到 t 的最小花费 。解法: 定义 状态 d[i][j] 表示到达 地点 i 且油箱中有 j 单位油时的最小 花费。 对于状态的转移时 , 有两种方法:1、把每个点的所有状态都求出2、不把每个点的状原创 2014-05-04 21:40:32 · 1178 阅读 · 0 评论 -
poj 2449 求第k最短路 A* + SPFA
这题要求出第k短路的长度对于第k短路 , 我们一般都是用A* + SPFA算法 ,首先 , 我们先求求出所有点到终点的最短路径长度 , 并把这些长度 , 最为估价函数的一部分然后,我们再用bfs、优先队列、加上A*算法思想 , 就能得到第k短路的长度对于第k短路 , 我们只需要在优先队列中第k次遍历到终点时 , 那么这个路径长度就是第k短路的长度,因为我们在使用优先队列时 ,最先出队的原创 2013-12-14 20:05:21 · 679 阅读 · 0 评论 -
poj 1364
这个题目英文太难了 , 看了半天都没看懂 , 不知道是不是老外出的题 。其实这就是一个差分约束的题目 。意思:给出一个系列 S1、S2、S3、S4...... , 然后给出三个数s、n、k和一个表示是大于还是等于的字符串 ,问:Ss +Ss+1 + .....+Ss+n 能不能满足题目要求和k的关系 。所以有关图的题目 , 最重要的就是能 , 分析出题目给的各个之间的关系 , 然后再通过原创 2013-12-14 20:03:58 · 538 阅读 · 0 评论 -
poj 1062 最短路
这个题目是中文题,很少见的。最短路问题,dijkstra算法的运用。。。很多同学对dijkstra有一种与生俱来的恐惧,首当其冲就是它的名字。。说实在我现在也不知道怎么念它O(∩_∩)O哈哈~其实dijkstra很简单的,最难也就它的名字,不懂得同学去翻书,这里我不解释dijkstra,我只说一个我认为能够很好理解dijkstra精髓的关键点: 新源点合并到旧源点时,新源点到旧源点的边权的原创 2013-12-14 20:01:48 · 942 阅读 · 0 评论 -
poj 1797
网上把这题归类到最短路 , 我认为应该归类到bfs 。题意:求出1——n路径上权值的最小最大值 。这题可以用bfs来做 , 也能用spfa来做 , 就是在压入点到队列的规则不一样 ,只要当使该点的值变大的边,才能压入队列代码:#include#include#include#include#includeusing namespace std;struct edge原创 2013-12-14 20:04:03 · 545 阅读 · 0 评论 -
poj1511(第一次用数组模拟邻接表…
题意:求出所有点到源点来回的最短距离 。解法:先求出源点到其他所有点的最短距离 , 再把所有边反向 , 再求源点到所有点的距离 。由于这题的数据量太大 , 所以只能用数组来模拟邻接表 , 如果用vector会超内存 。还要注意一点 , 一定要用long long代码:#include#include#include#include#includeusing namespa原创 2013-12-14 20:04:11 · 631 阅读 · 0 评论 -
poj 1135 有点弯的最短路运用
题意:有n个关键骨牌 , 每个两个相连的关键骨牌之间有一些普通牌 , 然后下面给出 m 行数据 , 每行有3个整数 a b t ,表示从关键骨牌a、b之间连有一些普通牌 , 并且从a倒向b需要时间t ,要求出最后开始倒下的哪一张张牌、什么时候开始倒下 。 最后开始倒下的有可能是一张关键骨牌 , 或是两张关键骨牌中间的某一张普通骨牌。解法:我们首先要求出每个关键骨牌开始倒下的最短(最早)原创 2013-12-14 20:05:08 · 573 阅读 · 0 评论 -
poj 2387 简单的dijkstra运用
题意: 给出n 个农场 , 和t条双向路径 , 求从农场1 到 你的最短距离?出题人有意思 , 输入时 ,题目先输入 t , 再输入 n#include#include#include#includeusing namespace std;#define max(u , v) (u)>(v)?(u):(v)#define min(u , v) (u) const原创 2013-12-14 20:05:10 · 581 阅读 · 0 评论 -
poj 1125 简单的floyd应…
题意有点模糊题意:要给所有人传递一个消息 , 问让所有多都知道的这个消息 , 应该让谁传递 ,然后输出这个人传递消息所需要的时间(消息可以同时向多个人传递)//floyd算法同时使用于有向、无向图 , 我允许环存在负权, 但是不允许存在负权回路#include#include#include#include#includeusing namespace std;const原创 2013-12-14 20:05:15 · 556 阅读 · 0 评论 -
poj 2662 最短路算法的扩展应用
题意:一个人要从办公室回到家里 , 问总共有多少条路 , 每个路(u, v)都要满足:存在一条从 v 回家的路 , 比所有从 u回家的路都要短?解法:首先要理解题意 , “存在一条从 v 回家的路 , 比所有从 u 回家的路都要短” 意思就是说从 v 回家的路 , 要比从 u回家的最短路径 还要短 , 那么, 我们就能利用这个关系建图 , 首先求出每个回家的最短路径 , 然后再从办公室的位原创 2013-12-14 20:06:30 · 632 阅读 · 0 评论 -
LA 4080 Warfare A…
这是一个最短路树的题目 , 这里有一个陷阱 , 有重边 , 如果有重边时必须用第二短的边来代替。解法:我们求出一个源点出发的最短路之后 , 我们得到的是一颗树 , 但是这颗树不一定是最小生成树 , 因此如果我们要删除的边在这颗树上, 那么这个源点出发的最短路径长度就会改变 , 如果不在 ,那么就肯定不会改变,因此我们就只需要判断这条边是否存在这棵树上。写代码时 , 一定要头脑清醒原创 2013-12-14 20:03:08 · 507 阅读 · 0 评论 -
poj 3268 简单的SPFA算法运用
题目关键在于: 存储图的正向和反向两种形式 , 然后分别求点x 到其他的的最短路径长度 , 这就等于求到了点x到其他点的最短路径和其他点到x的最短路径长度。代码:#include#include#include#includeusing namespace std;#define maxn 1110#define INF 0xfffffffstruct node //数组原创 2013-12-14 20:05:12 · 549 阅读 · 0 评论 -
poj 3249 DAG上的最短路问题
题意:一个人去找工作 , 然后得到一个面试题:有一些城市和城市之间的道路 , 没到达一个城市会赚一些钱也有可能会损失一些 ,从源点(入度为0的点)到终点(出度为0的点) , 收益得越多 , 就越有可能得到这份工作 , 问最多能得到多少?并且题目给出,每条路都是有方向的 , 并且不会有一条路会回到前的城市 , 显而易见 , 这是一个有向无环图(DAG) ,而由于本体数据太大,用普通的做短路算法原创 2013-12-14 20:05:23 · 1126 阅读 · 0 评论 -
hdu 2433 最短路树
这个题目的意思是: 题目给出一个无向图 , 问你删除其中一条边之后 , 所有点与点之间的最短路和 。一开始做这个题目的时候 , 用的是floyd算法的暴力解法 , 结果肯定是超时的。后面学到了最短路树之后才过掉 。当每个源点去求最短路时 , 就用一个数组来记录所产生的最短路树 ,然后后面在再这个树中查找, 是否存在删除的边 , 如果不存在 , 那么这个源点就不要求过最短路时间复杂度为O(原创 2013-12-14 20:03:06 · 651 阅读 · 0 评论 -
zoj 2770 差分约束的应用及其原理
这是一个简单的差分约束题 , 但是通过这题 , 我们能更好的理解 差分约束的 原理和应该注意的地方:差分约束,其实这是一种线性规划,给出n个不等式的条件 ,问是否能满足所有条件 , 由于我们最短路也是一系列的不等式 ,因此我们就把这些不等式和图、最短路等联系起来。例如:存在下面3个不等式 : b - a <= k1 , c - b <= k2 , c - a <= k3 ,求c - a原创 2013-12-14 20:05:30 · 938 阅读 · 0 评论