定义:如果一个系统由n个变量和m个约束条件组成,形成m个形如 ai - aj ≤ k 的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。

栗子:给出这样的一组不等式

A-B < = 3

B-C < = 6

C-D < = 5

E-C < = 2

B-E < = 3

求A-D的最大值。

经过一番脑跑之后,得出答案13。但是我们不能总是脑跑啊。。。费脑子QAQ,所以有什么科学的求法吗??

我们对A-B < = 3进行移项,改为 A < = B + 3 ,发现类似于最短路中的不等式 de[t] < =  de[f] + d ,可以看做是从B到A连了一条权值为3的边。我们把上面的不等式画成图。

发现答案即为D到A的最短路。

为什么呢??

把图单个剥离出来看

已知 (1) B-A < = x ;(2) C - B < = Y ;(3) C - A < = z .

则 C-A 的最大值 即为 1+2 和 3 比较 ,也就是 C-A<=x+y 与 C-A <=z 答案即为 min(x+y,z) (小小取更小),即为从A到C的最短路。

字面理解为B比A最大大x,C比B最大大y,C就比A最大大x+y,C又比A最大大z,所以我们要求一个x+y和z的最小值。

把它扩展为n个点,m条边的图,每一条边都是一个可传递的大小关系。S到T的路径可以看做许多S与T之间的大小关系(T-S < = ... ),我们要求的T-S的最大值就是最小的限制,也就是A到C最短路。

同理 B-A > = x , C-B > = y , C-A > = z ,也可以抽象为 de[t] > = de[f] + d ,这就转变为了最长路问题 ,这是求 C-A 的最小值 , 与上面思想相同。

也就是最大求最短,最小求最长。

关于Dist[]的初始化
1.如果将源点到各点的距离初始化为0,最终求出的最短路满足它们之间相互最接近了
2.如果将源点到各点的距离初始化为INF(无穷大),其中之1为0,最终求出的最短路满足 它们与该点之间相互差值最大。(from  baidubaike)

但是题目里给出的不等式不一定大于小于号的方向相同,如 求最大值时却给出了 D-E > = q , 只需要转化成 E-D < = -q 就可以了。(D到E连了一条边权为-q的边)。

那么问题又来了,不等式一定有解吗??

不一定。

数学上,多个不等式的解集分为 空集 , 有限集,无限集(暂且这么叫qwq)。

发现,若是S无法到T,即为无限多解(没有限制)。若S到T的路径上有环(最短路的负环,最长路的正环),无法取到最大值或最小值。

emmm。。。百度百科上的有关知识

引理:设x=(x1,x2,…,xn)是差分约束系统Ax≤b的一个解,d为任意常数。则x+d=(x1+d,x2+d,…,xn+d)也是该系统Ax≤b的一个解。

定理:将如上差分约束系统转换成图后,以为源点得到的最短路径序列为(如果有解),则满足且若任意解,则有

查查分约束时查到的神犇博客,十分详细易理解%%%

栗子 : codevs 2404 糖果

代码 qwq

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<deque>
 7 using namespace std;
 8
 9 int N,K,X,A,B,cnt,f;
10 int first[100010],next[400010],rd[100010];
11 long long de[100010],ans;
12 bool used[100010];
13
14 struct maple{
15    int f,t,d;
16 }Rode[400010];
17 deque<int> q;
18
19 void Build(int f,int t,int d)
20 {
21     Rode[++cnt]=(maple){f,t,d};
22     next[cnt]=first[f];
23     first[f]=cnt;
24 }
25 void SPFA() // 跑最长路
26 {
27     used[0]=1;
28     de[0]=1;  // 保证每个人都分到糖果
29     q.push_back(0);
30     while(!q.empty())
31     {
32         int a=q.front();
33         q.pop_front();
34         used[a]=0;
35         for(int i=first[a];i;i=next[i])
36            if(de[Rode[i].t]<de[a]+Rode[i].d)
37            {
38                   de[Rode[i].t]=de[a]+Rode[i].d;
39                   if(!used[Rode[i].t])
40                   {
41                          used[Rode[i].t]=1;
42                          if(!q.empty()&&de[Rode[i].t]>=de[q.front()]) q.push_front(Rode[i].t);
43                          else q.push_back(Rode[i].t);
44                          ++rd[Rode[i].t];
45                          if(rd[Rode[i].t]>=N)  // 判断是否有解
46                          {
47                                 f=1;
48                                 break;
49                          }
50                   }
51            }
52         if(f) break;
53     }
54 }
55 int main()
56 {
57     scanf("%d%d",&N,&K);
58     for(int i=1;i<=K;++i)
59     {
60         scanf("%d%d%d",&X,&A,&B);
61         if(X==1) Build(A,B,0),Build(B,A,0); // A = B
62         if(X==2) Build(A,B,1);   // B - A > = 1
63         if(X==3) Build(B,A,0);   // A - B > = 0
64         if(X==4) Build(B,A,1);   // A - B > = 1
65         if(X==5) Build(A,B,0);   // B - A > = 0
66     }
67     for(int i=1;i<=N;++i) Build(0,i,0); // i - 0 > = 0
68     SPFA();
69     if(f) cout<<-1;
70     else{
71         for(int i=1;i<=N;++i)
72            ans+=de[i];
73         printf("%lld",ans);
74     }
75     return 0;
76 }

(部分内容参考自各神犇博客,侵删 qwq)

转载于:https://www.cnblogs.com/maple-kingdom/p/maple-kingdom_sorry.html

学习笔记 查分约束系统相关推荐

  1. POJ2983 查分约束系统

    题意:        给你n个点,然后给你两种情况,P a b c,表明a在b的北边c那么远,V a b 表明a在b的北边(距离最少是1),问你这些条件是否冲突. 思路:       一开始想用带权并 ...

  2. POJ1275Cashier Employment(查分约束系统)

    链接1275Cashier Employment 题目大意就是说有一些人来应聘一个超级市场的工作,每个人的应聘的起始时间在0~23时之间,而超市在时间i需要R[i]个工作人员,而每个人的工作时间都是8 ...

  3. EJB3.0学习笔记---MDBbean--区分P2P模式和Pub/Sub模式的示例

    1.注意在写MDB程序的时候,如果是使用的P2P方式的话,可能你写了多个同样的MDBbean,但是   只会有一个MDBbean被调用,至于是哪一个被调用是随机的,这时候其他的将不会起作用; 一个消息 ...

  4. C语言学习笔记---查漏补缺

    1.强制类型转换表达式:(数据类型) (表达式) 2.C语言的头文件:C语言的头文件中包括了各个标准库函数的函数原型.因此,凡是在程序中调用一个库函数时,都必须包含该函数原型所在的头文件. 表达式:# ...

  5. 大象无形学习笔记-------查缺补漏

    UObject就有Network Replication了 被UPROPERTY标记的变量就有GC功能了,无需再用TSharedPtr,已经可以自动管理生命周期. 只有非UObject类型才能试用TS ...

  6. vb.net调用oracle存储过程,vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc...

    vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc 我的VBNETORACLE增删改查学习笔记(本源码在VBNET2008下测试通过)学习VBNET有一段时间了,之 ...

  7. 《全面掌握Linux C语言嵌入式系统移植教程》学习笔记(Liunx速查简明)

    全面掌握Linux C语言嵌入式系统移植教程学习笔记(Liunx速查简明) 笔记前言: P3: shell命令简明 P4: vi /vim编辑器入门 P5:vi /vim编辑器扩展 P8: gcc编译 ...

  8. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. Mysql学习笔记(七)查(补充)

    Mysql学习笔记(七)查(补充) 原文:Mysql学习笔记(七)查(补充) PS:五一还是要学习...虽然有点苦逼..但是路是自己选的,那么自己就要坚持的走下去... 学习内容: 1.数据库查找的补 ...

最新文章

  1. 在IIS8.5的环境下配置WCF的Restful Service
  2. 45. GameProject9+输入检测
  3. 发送语音+讯飞翻译 项目案例
  4. Linux-vmware tools安装与cdrom挂载
  5. cv::Exception问题
  6. python爬虫天气预报_Python爬虫实例扒取2345天气预报
  7. 刘志勇:微博短视频百万级高并发架构
  8. 数据结构关键路径_2021年厦门大学考研丨能源学院845数据结构参考书目推荐
  9. oracle 转储 mysql_Oracle中DUMP的转储方法
  10. Spring Boot AOP的使用
  11. 计算机考场桌子大小,自己打卧室电脑书桌最小宽度尺寸多少合适
  12. python 摄像头采集_Python+OpenCV采集本地摄像头的视频
  13. TCPIP详解 卷一核心概念整理
  14. protues仿真之数码管消影问题
  15. linux 端口转发 udp,Linux Socat TCP/UDP端口转发及使用
  16. Unity跳一跳小游戏简单代码
  17. C#开发工控上位机编程 csdn_C#联合WINCC之数据通信
  18. 价格敏感度测试(PSM)模型及其在网游中的运用
  19. 什么是缓存系统三座大山
  20. idea卸载不干净怎么办_Office卸载不干净怎么办?我想你一定需要Mac卸载Office的图文教程!...

热门文章

  1. 15本经典金融投资著作
  2. 下一个20年全球开发者将过亿?Tesra超算网络与开发者一起迎接AI时代的到来!
  3. 推荐一款超级好用的AI模型训练平台——Tesra超算网络!
  4. Fama-French 三因子模型介绍、修改与框架搭建
  5. 计算机毕业设计谢辞怎么写,关于毕业论文的谢辞范文(通用12篇)
  6. 元宇宙十大技术及其产业
  7. android 动态扫码框,Android 一行代码接入扫码功能 (CameraX + zxing)持续更新....
  8. 东方国信 Java一面
  9. TUSCANY 学习笔记1
  10. Docker容器时间不正确 差八个时区