首页 > 其他分享 >差分约束

差分约束

时间:2024-04-05 21:26:34浏览次数:26  
标签:连边 边权 差分 约束 Trick ge 例题

前言

考虑单源最短路的一个性质:

在有向图中,若存在边 \(u\to v\),边权为 \(w\),则 \(\mathit{dis}_u+w\ge\mathit{dis}_v\)。

正确性是显然的,因为如果反之 \(\mathit{dis}_u+w<\mathit{dis}_v\),我们就可以令 \(\mathit{dis}_v\gets\mathit{dis}_u+w\),原先的就不是最短路了,与题设矛盾。

那么怎么使用这个性质呢?

正文

当题目中出现形如

\(m\) 个限制条件,每个限制条件形如:\(a\ge b,a>b,a\le b,a<b,a=b\)。

时,就可以建图跑最短路。例如 \(a\ge b\) 就让 \(a\) 向 \(b\) 连权为 \(0\) 的边,\(a>b\) 就让 \(a\) 向 \(b\) 连权为 \(1\) 的边(前提是 \(a,b\in \Bbb{Z}\))。

例题:Luogu P5960 【模板】差分约束

直接连边跑最短路即可。但观察到无法快速确定一个源点,使得从它开始可以遍历到每个点。

Trick \(1\):可以建立超级源点 \(0\),让 \(0\) 向每一个点连边。如果怕被队列优化 Bellman-Ford 被卡还可以 random_shuffle() 一下 \(0\) 的出边。

例题:Luogu P1993 小 K 的农场

同理,但只需要判负环即可。直接上队列优化 Bellman-Ford。

例题:Luogu P3275 [SCOI2011] 糖果

(笔者由于懒,还未 AC 此题。不保证下面的话完全正确。)

依然考虑差分约束。但本题可以把队列优化 Bellman-Ford 卡爆!怎么办?

两种方案:

Trick \(2\):变正权边。

考虑到此题边权仅有 \(\{0,-1\}\),考虑将边权转为非负。事实上是可行的,只需将 \(-1\to 1\) 即可。

若有限制条件 \(a>b\),则一般情况下是转化为 \(a-1\ge b\),从 \(a\to b\) 连边,边权为 \(-1\)。

转化后跑最长路,从 \(b\to a\) 连边,边权为 \(1\)。此时满足条件 \(b+1\le a\),与原条件等价。这样就转化成了非负权单源最长路。

笔者试图使用 dijkstra 水过,但各 T(很神奇地被卡了),M(判不了正环) 了一个点。不知道有没有大佬知道解决方案。

Trick \(3\):配合 Tarjan 缩点。

以下题解使用了 Trick \(2\),当然不用应该也可以做。

先缩点,每个 SCC 内部如果出现了一条 \(u\) 到 \(v\) 的边权为 \(1\),根据 SCC 的定义,一定还存在一条 \(v\) 到 \(u\) 的路径,由于边权 \(\ge 0\),所以一定会出现一个正权环,则这个差分约束系统无解。

否则的话,发现 SCC 内部变量取值一定是相同的,那么问题变成了一个 DAG 上最长路,拓扑排序即可。

——来自该题题解

就很强。

可能以后还会更新。

标签:连边,边权,差分,约束,Trick,ge,例题
From: https://www.cnblogs.com/chargedcreeper/p/-/diff-constraints

相关文章

  • MySQL-相关约束
    MySQL-约束前提:防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息。为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。有以下考虑要点:①实体完整性(EntityIntegrity):例如,同一个表中,不能存在两条完全相同无法区......
  • P5960 【模板】差分约束
    原题链接题解我一直苦苦思考为什么要建边,现在我明白了,如果令\(x_i\)代表离源点的最短路径长度的话,建边之后,\(x_i-x_j<=y_k\)一定成立只有当出现负环的时候说明条件出现了矛盾太神了code#include<bits/stdc++.h>usingnamespacestd;queue<int>q;intin_q[5005]={0};......
  • mysql -约束合集笔记
    SQL创建数据库createdatabaseschoolUSEschool#(数据库名)创建数据库表:createtablestudents(useridINTNOTNULLPRIMARYkey,lastnamevarchar(255),firstnamevarchar(255))#创建student数据库表且设置userid为主键)SQL约束:查看某个表已有的约束:#inform......
  • 一维差分算法
    目录背景:一维插分应用场景一维差分法原理解释背景:在刷javaA组蓝桥本真题时,碰到了一个用二维差分方法的解题思路,意识到自己差分不熟悉,就想先学习一下一维差分。一维插分应用场景题目给出一个一维数组,并多次修改某一区间的值。例如:一个数组长度为8,初始均为0,输入数......
  • 数据库中的约束纯干货——主键约束
    目录(一)特点:(二)添加主键约束2.1格式:2.2举例:......
  • 差分数组
    定义对于数组A[n],它的差分数组为:\[diff[i]=\begin{cases}A[i],&i==0\\A[i]-A[i-1],&0<i<n\end{cases}\]显然,通过差分数组diff[n],可以求得A[n]中的某一具体元素:\[A[i]=\begin{cases}diff[i],&i==0\\diff[i]+A[i-1],&0<i<n\end{cases}\]应用数组A[n]......
  • 约束介绍
    约束介绍在给表中插入或者更新数据时,必须满足约束,否则,操作将失败。约束可以在创建表时规定,或者创建表后规定(使用AlterTable语句创建约束)。约束分为列级和表级。常用的约束包含:notnull、unique、primarykey、foreignkey、checknotnull:指定列不能存储null值unique:确......
  • FPGA时序约束实战
    改编自8FPGA时序约束实战篇之主时钟约束_checktimingnoclock 以Vivado自带的wave_gen工程为例,该工程的各个模块功能较为明确,如下图所示。为了引入异步时钟域,我们在此程序上由增加了另一个时钟–clkin2,该时钟产生脉冲信号pulse,samp_gen中在pulse为高时才产生信号。下面我......
  • SDC可伸缩的高维约束基准和算法
    可伸缩的高维约束基准和算法​ 在过去二十年里,进化约束多目标优化受到了广泛的关注和研究,并且已经提出了一些基准测试约束多目标进化算法(CMOEAs)。特别地,约束函数与目标函数值有紧密的联系,这使得约束特征太单调并且与真实世界的问题不同。因此,之前的CMOEAs不能特别好的解决现实......
  • 【PG】临时禁用约束-法一
    createorreplacefunctiondisable_triggers(aboolean,nspcharactervarying)returnsvoidas$$declareactcharactervarying;rrecord;beginif(aistrue)thenact='disable';elseact='enable';endi......