1.bzoj1489->
这是个新套路。
我们希望找到最小的x,那么可以二分x,然后判断是否存在圈的边权的平均值小于等于x。
设圈的边权依次为w1,w2,w3,…,wk,平均值为p,
则有p= (w1+w2+w3+…+wk)/k ,
可以推出p*k=w1+w2+w3+…+wk,
这样就会有(w1-p)+(w2-p)+…+(wk-p)=0,
当p≤x时,就会有(w1-x)+(w2-x)+…+(wk-x)≤0。
这样,可以通过把所有边的边权都改为w-x,然后通过判断负环得出存在圈的边权的平均值小于等于x。
代码,不知为何常数极大:
#include #include #include #include #include #include #include #include
2.bzoj1715->
判负环就ok。
说个小技巧:一开始将所有点的距离设为0,而不是正无穷,这样遇到负数才会更新。
说另一个小技巧:将bfs改成dfs,在判负环时可能会更优秀,但是有可能被卡,比如上一题。
#include #include #include #include #include #include #include #include
3.vijos1053->
板子题,代码就不贴了。
说下SLF优化:如果有一个点的距离被更新时,小于队列当前队首的距离,那么就把它放到队首。
它的依据在于,不存在负权边的情况下,队首的元素比它大,更新的点不会比它更优,也就是类似dijkstra的贪心。
但是,存在负权边时,这个优化就变得玄学了。比如点x入队时,队首y的距离大于x的,将x放在队首。但是存在一条y->x的负权边,在算y时又更新了x的距离,就让x额外入队了一次。
今天的超链接图是银火龙呢。