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

差分约束

时间:2024-08-19 12:06:15浏览次数:9  
标签:le 不等式 idx int 差分 约束

没什么好写的。

算法思路

有 \(n\) 个未知数 \(x_i\),给定 \(m\) 个形如 \(x_i-x_j\le c\)(\(c\) 为常数)的不等式。

\(\begin{cases} x_{a_1}-x_{b_1}\le c_1 \\ x_{a_2}-x_{b_2}\le c_2 \\ \dots\\ x_{a_3}-x_{b_3}\le c_3\\ \end{cases}\)

求一组最大解和最小解。使得所有的不等式成立。

我们以最小解为例讲解。

观察不等式,发现 \(x_i-x_j\le c\) 可以转换成类似 SPFA 中的三角形不等式的形式,即 \(x_i\le x_j+c\)。我们把 \(x_i\) 抽象成点 \(i\) 距离起点的最短路,不等式中的 \(c\) 就是边权。跑一趟单元最短路就可以了。但是不保证所有的点联通。所以规定一个源点 \(x_0=0\) 为起点,将其与每个 \(x_i\) 连一条边权为 \(0\) 的有向边。

差分约束中存在无解的情况,也就是说在任意一刻我们都无法求得正解,也就是说差分约束系统形成的图中存在负环,直接用 SPFA 判断即可

因为 \(x_i\le x_j+c\) 是对 \(x_i\) 取值上限的限制。我们也可以将原不等式变形为 \(x_j+c\ge x_i\)。这样是对其取值下限的约束,跑最长路即可,无解情况是存在正环。方法一求的是最大解,方法二求的是最小解。判负环的方式类似。

例题

例 \(1\):【模板】差分约束

没说最大解或最小解,直接求一个就好

点击查看代码
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int N=5e3+10;
int idx,ver[N],to[2*N],nxt[2*N],val[2*N],n,m,mk[N],dis[N],d[N];
queue<int>q;
void add(int x,int y,int z){
    to[++idx]=y,nxt[idx]=ver[x],ver[x]=idx,val[idx]=z;
}
int main(){
    scanf("%d %d",&n,&m);
    for(int i=1,u,v,w;i<=m;i++){
        scanf("%d %d %d",&u,&v,&w);
        add(v,u,w);mk[u]=1;
    }
    for(int i=1;i<=n;i++)if(!mk[i])add(0,i,0);
    memset(dis,0x3f,sizeof(dis));
    memset(mk,0,sizeof(mk));
    q.push(0),mk[0]=1,dis[0]=0,d[0]=1;
    while(q.size()){
        int t=q.front();q.pop();
        mk[t]=0;
        for(int i=ver[t];i;i=nxt[i]){
            int tp=to[i];
            if(dis[t]+val[i]<dis[tp]){
                dis[tp]=dis[t]+val[i];
                if(!mk[tp]){
                    if(++d[tp]>=n){
                        cout<<"NO"<<endl;
                        return 0;
                    }
                    q.push(tp),mk[tp]=1;
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        cout<<dis[i]<<" ";
    }
    return 0;
}

例 \(2\):小 K 的农场

主要将转换边权,设第 \(i\) 个农场有 \(x_i\) 个单位的作物。

  • 情况一:\(x_a-x_b\ge c\) 可转换为 \(x_b\le x_a-c\)
  • 情况二:\(x_a-x_b\le c\) 可转换为 \(x_a\le x_b+c\)
  • 情况二:\(x_a=x_b\) 可转换为 \(x_a\le x_b+0,x_b\le x_a+0\)

直接跑最短路即可

例 \(3\):[SCOI2011] 糖果

数据非常大,直接跑 SPFA 行不通。

转换为边权后,发现边权只有 \(0,1\) 两种。我们可以考虑缩点,先求出原图中的强连通分量。如果强连通分量中的两个点之间有 \(1\) 边权。则肯定无解,因为强连通分量中的所有点点权应当一样。

缩点后跑拓扑排序就好

例 \(4\):[1007] 倍杀测量者

显然,\(t\) 越大,女装的人越少,\(t\) 越小,女装的人越多。答案具有单调性,直接二分答案。判定很简单,我们先求出所有人不女装的不等式,如果题目中给定的所有不等式满足,则没人会女装。反之则一定有人女装。找到最大的不满足不等式的 \(t\) 就好。

我们发现,对于类似 \(x_a\ge (k-t)\times x_b\) 直接求会有精度误差。所以还是转换成三角形不等式。\(\log_2(x_a)\ge\log2(x_b)+\log2(k-t)\),就能解决问题。

另外,对于差分约束中的有常量的情况,例如:已知 \(k\) 的的点权 \(c_k\)。我们的维护办法是,连两条边,分别是 \((k,0,c_k),(k,0,-c_k)\)。这样就成功表示出了常量。

真的无法忍受有精度问题和带有高中数学知识的题目!

毕竟我连小学数学都玩不明白。

The End

感觉没什么用,大概会一点就好了,以后慢慢练。

我怎么连不等式都转换不好

upd:差分约束简单?什么人机话,我当时到底有多糖啊!

马上补一下差分约束

标签:le,不等式,idx,int,差分,约束
From: https://www.cnblogs.com/zuoqingyuan/p/18367048

相关文章

  • 洛谷P1083 [NOIP2012 提高组] 借教室 && 差分学习笔记
    传送门:P1083[NOIP2012提高组]借教室"八骏日行三万里,穆王何事不重来。"可惜啊,他再也没有回来……题目大意:给你每天能够租借的教室数量和几份租借申请每份申请包含租界时间(从第几天到第几天)和每天需要租借的教室数量问你能否满足所有的租借要求,如果不能,驳回一份最前......
  • 前缀和与差分
    前缀和与差分前缀和作用:快速求出数值中某段位置的数值和,降低时间复杂度一维前缀和//基本思想S[i]=a[1]+a[2]+...a[i]a[l]+...+a[r]=S[r]-S[l-1]//实现案例/*输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l,r。对于每个询......
  • Android经典实战之约束布局ConstraintLayout的实用技巧和经验
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点ConstraintLayout是Android中一种强大的布局管理器,能够帮助你创建复杂而灵活的布局。它通过约束系统将一个View的位置和大小与其他View或父布局联系起来,使得......
  • cadence allegro 新建一个PCB文件,从外观尺寸到约束,正确的工作流过程
    前言工欲善其事必先利其器,先头脑清晰的将原理图中需要约束特殊说明的功能和要求提前仔约束管理器中约束好,避免设计后期阶段出现间距不够、空间不够,无法布线的问题。试想下,你辛苦布线布局一周时间,正准备发出去制造时候,领导告诉你,你的固定孔位置不合理,你这条线距离边框太近......
  • 【PostgreSQL教程】PostgreSQL 高级篇之约束
    博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。感兴趣的可以先......
  • 电路构建、转换为约束系统、多项式承诺以及验证过程;为什么需要这几个步骤;;
    目录电路构建、转换为约束系统、多项式承诺以及验证过程算术电路构建转换为约束系统多项式承诺验证过程KZG承诺1.计算满足约束的x,a,b值2.构造多项式3.使用KZG承诺生成承诺值3.1Setup阶段3.2Commit阶段3.3(可选)Proveanevaluation阶段3.4Verify阶段算术......
  • 【MySQL】数据库约束和多表查询
    目录1.前言2.数据库约束2.1约束类型2.2 NULL约束2.3NUIQUE:唯一约束2.4 DEFAULT:默认值约束2.5 PRIMARYKEY:主键约束2.6FOREIGNKEY:外键约束1.7 CHECK约束3.表的设计 3.1一对一3.2一对多3.3多对多4.新增5.查询5.1聚合查询5.1.1聚合函数5.1.2 GROUPBY......
  • 【树上点差分、LCA】Max Flow P
    核心思路[USACO15DEC]MaxFlowP-洛谷sum[u]++,sum[v]++,sum[lca(u,v)]--,sum[fa[lca(u,v)]];本质上就是,对树进行差分自底向上进行统计处理#include<bits/stdc++.h>usingnamespacestd;intn,m;constintN=200000+10;vector<int>G[N];intdep[N],fa[N],hs......
  • 二维差分·学习备忘录
    二维差分为什么我为OI泪目?因为我菜得离谱......引入一维差分用来O(1)修改区间,配合上一维前缀和就是O(N)的查询区间和。差分为前缀和的逆运算。二维差分同理。接下来这道题就用二维差分来解决。\(例题:地毯>>\)地毯题目描述在\(n\timesn\)的格子上有\(m\)个地毯。......
  • 约束及其有关问题
    数学:最大公约数1.欧几里得算法常识若\(d|x\)且\(d|y\)则\(d|x+y\)且\(d|x-y\)且\(d|ax+by\)\(\gcd(a,0)=a\)辗转相减(更相减损术)\[\gcd(a,b)=\gcd(a,a-b)\]证明思路:证明左右两边的因子完全相同(这是很基本的数学证明方法)intgcd(inta,intb){//注......