自我分析,为什么用SPFA解差分方程,用最短路径求差分方程的最大解;用最长路径求差分方程的最小解.
如果给出的是一组:
a2 - a1 <= k1
a3 - a1 <= k2
....
之类的一组小于等于的不等式组...那么看 a - b <= k .. 化成 a < = b + k ... 这时构边是 b 为起点,a 为终点,权值为k的边...
而此时SPFA是求最短路径的Relax是
if ( d [ line.end ] > d [ line.start ] + line.wight )
d [ line.end ] = d [ line.start ] + line.wight;
那么 d [ line.end ] 的值最终将是 d [ line.start ] + line.wight 里最小的...若先令了一个源点...则这个d [ line.end ]就是 line.end 这个点的值..而这个值满足所有的约束条件..并且等于了最小的 a + k 但不会比最小的还要小..也就是 line.end 满足的是所有 line.end <= a+k 中a+k最小的...虽然line.end再小些也会满足与其所有 <= 的 关系..但正因为SPFA更新时一直是 = 所以求出的就是 d [ line.end ] 满足所有约束条件的最大值..
如果给出的是一组:
a2 - a1 >= k1
a3 - a1 >= k2
....
之类的一组小于等于的不等式组...那么看 a - b >= k .. 化成 a > = b + k ... 这时构边是 b 为起点,a 为终点,权值为k的边...
而此时SPFA是求最长路径,Relax是
if ( d [ line.end ] < d [ line.start ] + line.wight )
d [ line.end ] = d [ line.start ] + line.wight;
那么 d [ line.end ] 的值最终将是 d [ line.start ] + line.wight 里最大的...若先令了一个源点...则这个d [ line.end ]就是 line.end 这个点的值..而这个值满足所有的约束条件..并且等于了最大的 a + k 但不会比最大的还要大..也就是 line.end 满足的是所有 line.end >= a+k 中 a+k最大的...虽然line.end再大些也会满足与其所有 >= 的关系..但正因为SPFA更新时一直是 = 所以求出的就是 d [ line.end ] 满足所有约束条件的最小值..