• 基于最短路的差分约束模型


    1. 差分约束的功能

    • 不等式组的可行解
    • 满足不等式组每一个变量的最值

    不等式组中每一个不等式形式如下:

    \[x_i ≤ x_j + c_k \]

    其中,\(x_i\)\(x_j\) 是自变量, \(c_k\)是因变量。

    我们可以类比一下之前的最短路问题,假设存在一条从 \(j\)走到 \(i\),边权为 \(c\)的边。在进行最短路计算时,只要遇到 \(dist[j] > dist[i] + c\),我们就将 \(dist[j]\)更新为 \(dist[i] + c\)。因此,当做完最短路之后,对于所有的 \(j\),都有 \(dist[j] ≤ dist[i] + c\)

    如果给我们一个图,我们可以把每条边看成一个不等式,那么我们在这个图上求一遍起点到所有点的最短距离(注意从起点出发,一定能走到所有的边,因为如果走不到所有的点,就不可能完成求单源最短路的任务,就有个别点走不到嘛),求完之后每个边的不等式都是满足的。那么,任何一个最短路问题,都可以转换为一个不等式组。那么反过来也一样,一个不等式组也可以转换为一个最短路问题
    数缺形时少直观,形少数时难入微-华罗庚

    因此,我们在解不等式组问题的时候,遇到一个不等关系,就将它处理成为 \(x_i ≤ x_j + c_k\)的格式,然后建立 \(j → i\) 权值为 \(c_k\)的一条边。之后我们在这个图上,随便选择起点(该起点需要满足从该点出发,一定可以走遍所有的边,所以有时需要找一个超级源点,找不到一个可以能够到达所有点的起点,就没法按差分约束的方法来计算啦),求一下每个点到起点的最短距离,求完之后,所有的不等关系都会满足。

    2.求不等式的可行解

    综上所述,我们可以总结出差分约束求不等式可行解的做法:

    源点需要满足的条件:从源点出发,一定可以走到所有边(某个点走不到没有关系,因为从数学的角度,某个点就是某一个变量,既然没有边与它相连,它就没有任何约束)。

    步骤:
    【1】先将每个不等式 \(x_i ≤ x_j + c\) 转换成一条 \(j → i\) 长度为 \(c\) 的一条边
    【2】找一个虚拟源点,使得该源点一定可以遍历到所有边
    【3】从虚拟源点求一遍 单源最短路

    注意
    并不是所有图都存在最短路,图中可能存在负环,如果存在负环对应到不等式中就是无解

    因此,建图完毕以后,做一次最短路,只有两个结果:

    • 如果存在负环,那么该不等式组一定无解
    • 如果不存在负环,则 \(dist[i]\)就是原不等式组中 \(x_i\)一个可行解

    3. 求满足不等式组中每一个变量的最值

    只记结论: 如果求的是最小值,则应该求最长路;如果求的是最大值,则应该求最短路。为什么呢?
    以求\(x_i\)的最大值为例:求所有从\(x_i\)出发,构成不等式链 \(x_i ≤ x_j + c_1 ≤ x_k + c_2 + c_1 ≤ . . . ≤ c_1 + c_2 + . . . + c_k\),通过做最短路以后可以确定 \(x_i\)的一系列上界,最终 \(x_i\)的最大值就等于所有上界中的最小值。

    最长路的建图方式和\(2\)节中最短路的建图方式一样,把不等式转换成 \(x_i ≥ x_j + c\), 建立一条 \(j → i\) 长度为 \(c\) 的一条边(最短路只看\(≤\),最长路只看\(≥\))。

    我们知道,如果不等式组中仅仅包含不同变量之间的大小关系,那么我们求出的可行解一定是一个包含变量的相对关系,它不存在一个极值的概念。

    因此,一旦题目让我们求满足不等式关系的极值,那么一定会在不等式组中加入形如 \(x_i ≤ c\)\(x_i ≥ c\) 这样的条件(小于还是大于看求最短路还是最长路),这样才能确定最后不等式组的边界,得到极值。那么,如何处理形如这种单变量常数关系呢?

    【问题】如何转化形如 \(x_i ≤ c\),其中 \(c\)是一个常数的这类关系?
    答:建立一个虚拟源点 \(0\),转换为 \(x_i ≤ x_0 + c\),然后建立 \(0 → i\),长度是 \(c\)的边。

  • 相关阅读:
    PCLVisualizer::addSphere 运行报错解决方案
    八叉树 (转载)
    Django 迁移错误 Cannot add foreign key constraint,字段类型自动变成Bigint(20)
    Django之Model字段详解
    FineReport如何连接hadoop,hive,Impala数据库,Kerberos认证
    图片自适应容器的几种方法
    【windows】查看电池使用情况
    【C++】C++复合变量的定义及易错点
    【c++】C++自定义类注意事项
    金字塔池化Spatial Pyramid Pooling
  • 原文地址:https://www.cnblogs.com/littlehb/p/16064346.html
Copyright © 2020-2023  润新知