首页 > 其他分享 >负环、差分约束和传递闭包

负环、差分约束和传递闭包

时间:2022-12-09 21:57:36浏览次数:68  
标签:闭包 约束条件 le dist ... 差分 约束 负环

差分约束

https://oi-wiki.org/graph/diff-constraints/

定义

差分约束系统 是一种特殊的 \(n\) 元一次不等式组,它包含 \(n\) 个变量 \(x_1,...,x_n\) 以及 \(m\) 个约束条件,每个约束条件是由两个其中的变量做差构成的,形如 \(x_i - x_j \le c_k\),其中 \(1 \le i, j \le n, i \neq j, 1 \le k \le m\) 并且 \(c_k\) 是常数(可以是非负数,也可以是负数)。我们要解决的问题是:求一组解 \(x_1=a_1,...,x_n=a_n\),使得所有的约束条件得到满足,否则判断出无解。

差分约束系统中的每个约束条件 \(x_i - x_j \le c_k\) 都可以变形成 \(x_i \le x_j + c_k\),这与单源最短路中的三角形不等式 \(dist[y] \le dist[x] + z\) 非常相似。因此,我们可以把每个变量 看做图中的一个结点,对于每个约束条件 \(x_i - x_j \le c_k\),从结点 \(j\) 向结点 \(i\) 连一条长度为 \(c_k\) 的有向边。

注意到,如果 \(\{a_1, ..., a_n\}\) 是该差分约束系统的一组解,那么对于任意的常数 \(d\),\(\{a_1+d, ..., a_n+d\}\) 显然也是该差分约束系统的一组解,因为这样做差后 \(d\) 刚好被消掉。

过程

设 \(dist[0] = 0\) 并向每一个点连一条权重为 \(0\) 边,跑单源最短路,若图中存在负环,则给定的差分约束系统无解,否则,\(x_i = dist[i]\) 为该差分约束系统的一组解。

时间复杂度 \(O(nm)\)。

原理

对于一个环,假设两个相邻点编号为 \(i,j\)。如果存在负环,那么 \(w_i - w_j \le a_1\),\(w_i - w_j \ge -a_2\),且 \(a_1 + a_2 < 0\),也即 \(a_1 \le -a_2\)。显然矛盾。

否则,对于 \(w_i - w_j \le a\),在图上体现了 \(d_i \le d_j + a\) 的限制。(从 \(j\) 连向 \(i\))而 \(d_i\) 体现为 \(0\) 到 \(i\) 的距离。

扩展

考虑差分约束系统 \(\cfrac{w_i}{w_j} \le c_k\) 的求解方式。就是把每个数字取 \(\log\) 即可。

传递闭包

floyd,但是每条边表示某一种关系 \(rel_{i, j}\)。对于 \(rel_{i, j}\) 和 \(rel_{j, k}\),可以维护将其合并到 \(rel_{i, k}\)。

标签:闭包,约束条件,le,dist,...,差分,约束,负环
From: https://www.cnblogs.com/Zeardoe/p/16970082.html

相关文章

  • Input 输入框的 防抖和节流 (闭包的应用)
    //防抖点击之后过了wait才响应,如果一直点,就一直没有响应,直到你停下来后,wait后执行。防抖是一进来就清,然后wait后再做exportfunctionantishake<T>(fn:T,wait:number......
  • 彻底理解Python中的闭包和装饰器(上)
    什么是闭包闭包(Closure)其实并不是Python独有的特性,很多语言都有对闭包的支持。(当然,因为Python是笔者除C/C++之外学习的第二门语言,所以也是第一次遇到闭包。)简而言之,闭包实......
  • 彻底理解Python中的闭包和装饰器(下)
    上篇讲了Python中的闭包,本篇要讲的装饰器就是闭包的一个重要应用。如果你还不知道什么是闭包,猛戳这里阅读:彻底理解Python中的闭包和装饰器(上)什么是装饰器装饰器的作用是......
  • python 函数闭包(二)
      程序开始执行,执行到test()函数,不执行继续往下执行,当遇到test(100)调用函数的时候,将实参100传给形参number,然后又执行到内部的test_in()函数,程序不执行,执行......
  • python闭包使用(一)
     在python中,当定义了一个函数的时候,函数名实际上是定义了一个变量,指向了一片定义好的函数体,这意味着函数名,也就是定义了一个变量,这个变量存储着所定义的函数的引用......
  • Go | 闭包的使用
    闭包基本介绍闭包就是一个函数和其相关的引用环境组合的一个整体好处:保存引用的变量,下次继续使用,不会销毁下面通过闭包的方式,写一个数字累加器,体验一下闭包的妙处......
  • Color the ball HDU - 1556 _差分
    N名同学拍成一排,编号为1,2,3,4……N。现在有一位老师需要检查所有同学的出勤情况,他会进行点名,每次给出两个数a,b,并且保证a小于等于b,这个区间内的所有同学都会被点名一次,老师......
  • Swift闭包简要概述
    1.闭包闭包是一个捕获了外部变量或者常量的函数,可以有名字的函数,可以是匿名的函数,也可以是不捕获外部变量的函数。所以可以说闭包是特殊的函数。闭包是自包含的函数代码块,可......
  • 闭包的使用场景
     functionfa(){letcon="闭包的内容";functionfb(){console.log(con);}returnfb;}letcontent=fa()();content;//闭包的内容......
  • HDU 6273 Master of GCD(差分)
    题目分析贴一个别人的题解这个题就是一个差分数组,因为这数列的最大公约数就是这个数列2的出现2的最少次数的幂乘以3的出现3的最少次数的幂将2和3分开讨论,然后分......