zoukankan      html  css  js  c++  java
  • 浅谈差分约束系统

      花了很长时间,终于把差分约束搞清楚了……

      当我们在一个图上跑SPFA或DIJKSTRA时,我们能够得到什么?得到的是单源最短(长)路,也就是∀v的min(max){dis[v]-dis[s]},dis[s]是一个全局的“偏移量”,只是通常dis[s]为0而我们未有察觉而已。

      考虑为什么跑出来就能得到这样的结果,是因为有一种叫做“松弛操作”的东西。也就是说,如果u到v有一条边其权为w,就可以得到dis[u]+w≤(≥)dis[v],移项得到dis[v]-dis[u]≥(≤)w。因为一条路上一环衔一环,所以联立一条路就能得到dis[v]-dis[s]≥(≤)……。因为路有很多条,再度联立就能得到相应的最值。

      后人根据图上如此的性质,发现了差分约束系统。差分是什么?就是我刚才说的“一条路上一环衔一环”。约束是什么?就是构成“每一环”的约束边dis[u]+w≤(≥)dis[v]。在差分约束系统上跑最短(长)路,也就会得到∀v的min(max){dis[v]-dis[s]},这是大多数问题叫我们求的。因为min{x[t]-x[s]}与max{x[s]-x[t]}互为相反数,所以既可以从s开始跑最长路,也可以从t开始跑最短路。

      你或许会说,反了反了!但是,事实总是超出我们预料的。就像二分图中,最小边覆盖 = 最大独立集=n-最大匹配。在这里,合法的最小解就是约束图上的最长路,合法的最大解就是约束图上的最短路。

      为什么?在这里,依仗“元神”是不行的。因为我们不能这么“唯心”,要用“唯物”的方法动自己的脑子。

      最后需要注意的是,DIJKSTRA跑起来会很有问题,因为贪心的基础不存在了。

  • 相关阅读:
    Redis分布式锁的实现原理
    Redis锁的简单应用
    Redis所需内存 超过可用内存怎么办
    redis学习笔记之虚拟内存
    组织安全性SQL
    应收发票相关脚本
    用户与职责与请求关系语句
    应收事物处理删除 SQL 语句
    总账库存科目明细追溯
    月结各模块关闭情况查询
  • 原文地址:https://www.cnblogs.com/Doggu/p/chafen.html
Copyright © 2011-2022 走看看