zoukankan      html  css  js  c++  java
  • 图论小专题C

    3 负环及其应用

    3.1 判定算法

    判断负环只能用“边松弛”算法,也就是Bellman-Ford和SPFA算法。这两个算法都是(O(NM))级别的。因为负环中一定存在一条负边,使得(dis_i > dis_j+d(i,j))恒成立。因此,在用边松弛算法时,如果一条边被松弛超过一定次数,我们就可以判定图中存在负环。负环则代表环上的边权和小于0。在负环上走若干圈,则(dis_i)可以趋近(-infty)

    Bellman-Ford算法
    如果经过(n)轮迭代后,仍然有边可以被更新,则图中存在负环。
    否则,如果在(n-1)轮迭代后,如果不能更新任何一条边,则图中不存在负环。

    SPFA算法
    (|Gamma_i|)表示从源点到(i)的最短路包含的边数。规定(|Gamma_S|=0)。当转移(dis_y = dis_x + d(x,y))成立时,我们同时令(|Gamma_y| = |Gamma_x| + 1)。在任意时刻,如果有(|Gamma_y| geq n),则图中有负环。

    我们也可以用入队次数来判断。如果一个节点被入队(n)次以上,则图中存在负环。

    当然,前面也介绍过一种基于DFS的SPFA判断负环的方法。这种方法速度较快,但是比较专一。在计算最短路时,效率远不如基于队列的SPFA。

    3.2 应用

    其实比较灵活。只介绍一些比较简单的应用

    图上二分
    极少数题目会出现。由于本人做题不多,这里只能给出一道例题:HNOI2009 最小圈
    由于答案具有单调性——即不存在小于答案的平均值,而一定存在大于等于答案的平均值,我们可以二分求出最小值。设这个平均值为(ar{w}),那么根据平均值的性质,对于环上的边(w_i),有(sum_{i=1}^{0}(w_i-ar{w})=0)。我们二分这个平均值(ar{w}),然后把每条边的边权设置为(w_i-ar{w})。如果图中存在一个负环,说明当前平均值合法,可以进一步缩小。时间复杂度可以看作(Omega(mlog W))。当然,最坏情况还是(O(nmlog W))的。其中(W)表示边权的上下界之差。

    差分约束系统
    是一种特殊的(N)元一次不等式组。其中每一个不等式都形如(X_i - X_j leq c_k)。通过移项,我们可以得到一个不等式:(X_i leq X_j + c_k)。这个不等式酷似我们之前所讲到的三角形不等式。我们的目标就是求出一组(X_i)使得每一个三角形不等式成立。对于(X_i - X_j geq c_k)的不等式,可以转换为(X_j - X_i leq -c_k)的形式解决。

    注意到如果({X_i})是一组解,那么通过加上一个常数(c),我们可以得到另一组解({X_i+c})。我们不妨假定每一个变量都是负数或0,设(X_0 = 0),令(X_i leq 0),则(X_i - X_0 leq 0)。我们由(X_0)向所有点连一条边权为0的边,然后对于所有(X_i - X_j leq c_k)的边,我们往(j)(i)连一条边。这时,(X_i)的实际意义就是从(0)点到(i)点的最短距离。用最短路算法就可以求出一组负数解。

    当构造出来的图中存在负环,(X_i)会被不断更新:说明(X_i)的值始终无法满足每个不等式。此时这个差分约束系统无解。由于既要求出最短路,又要判断负环,这里应该使用SPFA。

  • 相关阅读:
    BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
    Luogu 3690 Link Cut Tree
    CF1009F Dominant Indices
    CF600E Lomsat gelral
    bzoj 4303 数列
    CF1114F Please, another Queries on Array?
    CF1114B Yet Another Array Partitioning Task
    bzoj 1858 序列操作
    bzoj 4852 炸弹攻击
    bzoj 3564 信号增幅仪
  • 原文地址:https://www.cnblogs.com/LinearODE/p/11339522.html
Copyright © 2011-2022 走看看