细草微风岸

平凡而不平庸

常用链接

统计

最新评论

zoj 3339 spfa

求3个点之间联通的最短线路长度。注意支撑点不一定在这3个点中。因此需要分别求3次到这3个点(x,y,z)的单源最短路径,然后遍历每个节点j(支撑点),求dis(x,j)+dis(y,j)+dis(z,j)的最小值。
这题最多求 3*50(查询次数)次单源最短路,小于500,所以用Floyd求所有的单源最短路容易超时。
此处点数较少可以用Dijkstra,如果点数较大无法使用邻接矩阵时,可以采用另一种方法更为快速,spfa(复杂度为K*E,可以证明K在2左右)但是时间效率不及Dijkstra稳定,实际应用中很多用Dijkstra,它利用了松弛原理(三角型2边之和大于第3边),只要在松弛时维护一个队列,并且用标记访问数组防止元素重复入队即可。spfa是bellman-ford的队列优化,每次不用枚举所有的点,而是使用队列来更新点。用spfa的前提是边权为正。spfa判断负权边的方法是:如果有一个点超过|V|次入队列。可以用path[u] = v来存储松弛时通过v更新u,u之前的点是v,如果打印路径,可以用递归的方法克服逆序问题。spfa的改进方法为LLL,SLF。
spfa参考:
http://www.cnblogs.com/zgmf_x20a/archive/2008/12/18/1357737.html
http://www.nocow.cn/index.php/SPFA
解题报告在浙大某大牛那 http://watashi.ws/blog/1492/zojmonthly1009/

posted on 2011-07-29 16:47 鲍青 阅读(245) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理