摘要:
POJ_3667 第一次接触区间合并的问题,更多区间合并的问题可以参考胡浩的博客http://www.notonlysuccess.com/index.php/segment-tree-complete/。 既然要查询是否存在一个长为d的连续空区间,那么我们至少要记录对于每个区间而言,其中的最长的连续空区间是多大,这个用mc[](max contiguous)表示。同时在查找的过程中,连续空区间有三种形式,在左子树,在右子树,或者横跨两棵子树。当然我们要优先找左子树,最后再找右子树,那么中间的这个横跨的怎么办呢?于是我们可以引入lc[](left contiguous)表示一个区间从左边开始. 阅读全文
摘要:
POJ_2449 一开始我的思路就是把图上每个点搞一个容量不小于K的最大堆和最小堆,最小堆用于取当前该节点的第某短路值,最大堆用来保存前K小的最短路。 最后为了每次能查询全局最小值,再把N个点放到一个线段树(最小堆)上即可,剩下的工作就是进行dij的过程了,当访问终点的次数达到第K次时break即可,这时就是第K短路的值了。 但这样会TLE,所以还是要用A*算法。 感觉A*就像是个优先级队列,从这个角度讲,dij本来也是A*算法,只不过其估价函数就等于起点到该点的最短距离。 而这个题目需要变一下估价函数,设g[i]为由某条路线从S到i点的路径长度,d[i]表示i点到T的最短路,那么我... 阅读全文
摘要:
POJ_3255 本来想做POJ_2449的,结果自己想的这个算法TLE,看来解决那个题只能搞A*了。 这个题目由于求次短路,第K短路的K就是2,比较小,所以可以直接用纯dij搞。我的思路就是把图上每个点搞一个容量不小于K的最大堆和最小堆,最小堆用于取到达当前该节点的第某短路值,最大堆用来保存前K小的最短路。 最后为了每次能查询全局最小值,再把N个点放到一个线段树(最小堆)上即可,剩下的工作就是进行dij的过程了,当访问终点的次数达到第K次时break即可,这时就是第K短路的值了。 当然,这么做其实是麻烦了,因为实际上K为2,所以可以直接把一个点拆成两个点,一个存当前最短路值,一个存次... 阅读全文