[题目连接]洛谷 BZOJ1731
推荐洛谷 因为好多OJ这一题数据较水(亲测)
题意
正如其他物种一样,奶牛们也喜欢在排队打饭时与它们的朋友挨在一起。有编号为 1 2…N 的 N头奶牛 (2 ≤ N ≤ 1000)。开始时,奶牛们按照编号顺序来排队。奶牛们很笨拙,因此可能有多头奶牛在同一位置上。
有些奶牛是好基友,它们希望彼此之间的距离小于等于某个数。有些奶牛是情敌,它们希望彼此之间的距离大于等于某个数。
给出 ML 对好基友的编号,以及它们希望彼此之间的距离小于等于多少;又给出 MD 对情敌的编号,以及它们希望彼此之间的距离大于等于多少 。(1 ≤ ML,MD ≤ 1e4)
请计算:如果满足上述所有条件,1 号奶牛和 N 号奶牛之间的距离最大为多少。
输出格式
一行,一个整数。如果没有合法方案,输出 -1. 如果有合法方案,但 1 号奶牛可以与 N 号奶牛相距无穷远,输出 -2. 否则,输出 1 号奶牛与 N 号奶牛间的最大距离。
题解
很明显的差分约束了
根据题目,可列出以下式子:( u < v )
dis[v] − dis[u] ≤ L ⇒ dis[v] − dis[u] ≤ L ⇒ 从u到v连一条边权为L的边 add(u, v, L)
dis[v] − dis[u] ≥ D ⇔ dis[u] − dis[v] ≤ −D ⇒ dis[v] − dis[u] ≥ D ⇔ dis[u] − dis[v] ≤ −D ⇒ 从v到u连一条边权为-D的边 add(v, u, -D)
这些是比较容易想到的条件了, 但是 根据题意 dis[i] <= dis[i+1] 也就是说需要add(i, i-1, 0)。 然后一般性水点的数据没问题了,可是万一图上是存在负环的,可是你选择的起点,正常是 1 号点是独立于负环的, 也就是说万一起点根本没有进入负环,你的答案就出错了, 正确答案应该是 -1 。 所以还要设一个 0 号点, 与所有点建立 0 边, 第一次跑 SPFA 以 0 号点为起点,如果有负环,直接输出 -1 就行了, 否则以 1 号点为起点再跑一遍 SPFA,就能得到正确答案了。(有点意思)
Code block
1 |
|