最近闲暇了一些,想起好久没在POJ上做题了,这两天做了下。1860这题是一个求图最优路径的题目,题目的关键是找到图中的正向环。为了做题,专门花了时间看了下Dijkstra算法,Dijkstra关键点大致是,遍历图中其它节点,记录到当前节点最短距离的点,通过回溯即可找到最短路径。不过Dijkstra思路只能针对大于0的权值,因为当负向环存在时,绕着负向环来回转会得到值越来越小的路径。
最短路径算法通常依赖一种性质,也就是一条两个点间的最短路径包含路径上其它的最短路径。最大流算法亦然,这也是动态规划和贪心算法适用的重要保证,Dijkstra算法是贪心算法,ford-warshell为动态规划。
本题中的货币兑换,1、货币作为节点,点之间权值是动态的;2,、货币兑换是相互的,因此节点之间都是双向的,必然形成环;3、衡量兑换货币后是否获利,只能兑换回本币才能衡量,这就是一个正向环。其实只要有一个正向环存在,绕着正向环转即可获得一个无限大的值。问题归结到判定有没有正向环。
参考bellman-ford算法,只需要在第二次图遍历的时候,判定有节点最大值更新即可,如果没有正向环存在,那么第一次遍历的时候就已经寻找到最优路径,有正向环存在则永远也没有最优路径,绕着环即可获得无限大的路径。
bellman-ford为什么要迭代V-1次,因为下面的性质,由于每一次并不知道(vk,vk-1)是哪一条,因此只能全部遍历,一共需要遍历 V-1次

这次倒不是因为算法问题让人纠结,主要是用的float变量数值表达长度不够,导致十几次WA,改成double后终于AC。
本题如果用邻接矩阵千万注意,两点之间可能不止一条边相连,重复赋值可能导致边最后的值不是最值,影响环的搜索,这里根据情况取最大或最小值
最短路径算法通常依赖一种性质,也就是一条两个点间的最短路径包含路径上其它的最短路径。最大流算法亦然,这也是动态规划和贪心算法适用的重要保证,Dijkstra算法是贪心算法,ford-warshell为动态规划。
本题中的货币兑换,1、货币作为节点,点之间权值是动态的;2,、货币兑换是相互的,因此节点之间都是双向的,必然形成环;3、衡量兑换货币后是否获利,只能兑换回本币才能衡量,这就是一个正向环。其实只要有一个正向环存在,绕着正向环转即可获得一个无限大的值。问题归结到判定有没有正向环。
参考bellman-ford算法,只需要在第二次图遍历的时候,判定有节点最大值更新即可,如果没有正向环存在,那么第一次遍历的时候就已经寻找到最优路径,有正向环存在则永远也没有最优路径,绕着环即可获得无限大的路径。
bellman-ford为什么要迭代V-1次,因为下面的性质,由于每一次并不知道(vk,vk-1)是哪一条,因此只能全部遍历,一共需要遍历 V-1次
这次倒不是因为算法问题让人纠结,主要是用的float变量数值表达长度不够,导致十几次WA,改成double后终于AC。
本题如果用邻接矩阵千万注意,两点之间可能不止一条边相连,重复赋值可能导致边最后的值不是最值,影响环的搜索,这里根据情况取最大或最小值
398

被折叠的 条评论
为什么被折叠?



