- 博客(5)
- 收藏
- 关注
原创 最短路算法集合
一、Dijkstra算法:仅限用于无边权为负数的图,更不能正确处理负环的情况。把所有点分成两个集合,S集合是存已经确定下来、不会再更改(准确一点的话是“不能再更改”)的点,T集合是待确定的点集。从T集合中的点中,选择一个到st最近的点x。让这个点为其它点更新:如果y点到st的距离大于 x点到st的距离 + x->y这条边的距离,则改进y到st的值。然后x加入S集合。更透彻地理解,这种算法每次...
2018-02-13 11:36:09 450
原创 SPFA—SLF+LLL优化
spfa的时间复杂度为O(me),其中e为路径数量,m为所有顶点进队的平均次数。有两种优化策略,分别是SLF和LLL。如果两者加起来,最大可以减少50%的时间。它们的最终目的是一致的,都是想让最靠进答案的点先去更新它附近的点,可能更新过程中就把目前队列中的点给更新了。如果先让那些迟早要被更新的点先去更新其他点,所有这些点迟早会被再更新一遍。因此,m的值就会变大。想要控制spfa的时间复杂度,就要从...
2018-02-12 15:30:09 582 2
原创 树状数组—改段求段
改段求段是树状数组中的一个重难点,它需要运用上改段求点的知识。需要2个树状数组:c1,c2。c1与改段求点的c一样,都是记录差值,为了求出某个点的值。c2用来记录当以c1[ i ]×i来求1~i的值时,与真实值的差(c2[ i ]=ans-c1[ i ]×i),所以ans=c1[ i ]×i+c2[ i ]。当c2需更新时,只需改头和尾+1即可。头:加上 -(x-1)*z,因为a[ x ]增大了,...
2018-02-08 11:07:53 545
原创 树状数组—改点求段
改点求段是树状数组中最简单的,它只改变某个点,然后求某一段。获得x的管理范围:int lowbit(int x) { return x&-x; }给x加上k:(不停地找上司,不停地改变,直到到了头)void add(int x,int k) { while(x<=n) { c[x]+=k; x+=lowbit(x); ...
2018-02-08 11:00:20 387
原创 树状数组—改段求点
对于更改一段区间的值,然后求出某个点的值的问题,我们可以先记录它的第一个量,后面记录两两的差值(c[ i ] = a[ i ] - a[ i-1 ]),所以a[ i ] = a[ i-1 ] + c[ i ]。这样就可以利用树状数组求和快的特点,迅速求出其值。相当于每个c存的是与上一个值的距离(意思就是需要改变多少就能得到现在这个值)。在更新时也只需要改区间头的c值 以及区间尾+1的c值 即可。其...
2018-02-08 10:55:14 462
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人