• 差分约束系统


    前置:求解最长路

    1. 将边权取相反数,设此时图为 (G')。若 (G') 无负权环(即 (G) 无正权环),则有 (d'[v]le len'[v]),其中 (d'[v]) 为在图 (G') 上求得的最短路,(len'[v]) 为源点到 (v) 的任意路径权值和。同时可得 (-d'[v]ge len[v]),所以可以得到 (D[v]=-d'[v]),其中 (D[v]) 为原图源点到 (v) 的最长路。
    2. 实际上,由于最短路有:if(d'[v]>d'[u]+w'(u,v)) d'[v]=d'[u]+w'(u,v),我们可以将其改写为 if(D[v]<D[u]+w(u,v)) D[v]=D[u]+w(u,v)

    差分约束系统

    1. 如果求最大值。

      按小于等于建图求最短路。负环无解。

    2. 如果求最小值。

      按大于等于建图求最长路。正环无解。

    例题

    例 1. HDU - 3440 House Man

    题意:

    (n) 栋房子,给出每栋房子的高度和开始时的相对位置(相邻初始距离均为 (1)),可以移动一些房子。

    现在从最矮的房子开始,每次跳至比它高的第一栋房子,而且每次跳跃的距离最大是 (D)。问跳到最高的房子的最大距离可以是多少?

    注意房子不能在同一位置,房子的相对位置不能改变。

    如果不能从最矮的房子到达最高的房子则输出 (-1)

    求最大值,则按小于等于建图求最短路。负环无解。

    有两个限制:

    1. 相邻房子距离至少为 (1)
    2. 相邻高度房子距离至多为 (D)

    最后需要注意,查询时应查询编号小的房子到编号大的房子的距离,如果反过来查根据我们的建图得到的值应该是负值。


    例 2. CF1450E Capitalism

    求最大值,则按小于等于建图求最短路。负环无解。

    对于限制 (|a_i-a_j|=1),可以拆成 (|a_i-a_j|le 1)(|a_i-a_j|ge 1)

    继续拆成四个条件:(a_ile a_j+1)(a_ige a_j+1),$a_jle a_i+1 $ 或 (a_jge a_i+1)

    选择最弱的一组条件:$a_ile a_j+1,a_jle a_i+1 $。

    最后因为条件是等号,需要判断一下是否为二分图。

    (mathtt{Floyd}) 找出最大值即可。

  • 相关阅读:
    雅礼集训2017day5乱写
    任意值域最长公共子序列问题
    雅礼集训2017day4乱写
    雅礼集训2017day2乱写
    SP839
    雅礼集训2017day1乱写
    CF671E
    仅维护当前区间影响类问题的线段树
    「雅礼集训 2017 Day4」编码
    Codeforces Round #503 Div. 2
  • 原文地址:https://www.cnblogs.com/AWhiteWall/p/13747217.html
Copyright © 2020-2023  润新知