博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
差分约束(例区间选点
阅读量:3951 次
发布时间:2019-05-24

本文共 1446 字,大约阅读时间需要 4 分钟。

目录

差分约束系统定义

一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式

(i,j∈[1,n],k为常数),则称其为差分约束系统(system of difference constraints)

解释:其实就是一堆不等式,然后求出一组解。不等式形如 Xi-Xj<=Ck  (i!=j)然后我们需要求出一组解X1~Xn有{
A1~An},而对于常数d,{
A1+d~An+d}也是它的一组解,因为做差可以将d消除

在这里插入图片描述

在这里插入图片描述

差分约束与SPFA

利用差分约束解决问题的时候,我们常常把它化为求最短路径问题,因为要把不等 式化为我们想要的形式,所以常常会有负数,即是会出现负边权的问题,所以Floyd和Dijkstra通常无法解决,我们就用Bellman-Ford算法来解决此类问题。

常见的不等式转换

在这里插入图片描述

区间选点问题

给定一个数轴上的 n 个区间,要求在数轴上选取最少的点使得第 i 个区间 [ai, bi] 里至少有 ci 个点

Input
输入第一行一个整数 n 表示区间的个数,接下来的 n 行,每一行两个用空格隔开的整数 a,b 表示区间的左右端点。1 <= n <= 50000, 0 <= ai <= bi <= 50000 并且 1 <= ci <= bi - ai+1。
Output
输出一个整数表示最少选取的点的个数

Sample Input

53 7 38 10 36 8 11 3 110 11 1

Sample Output

6

分析:之前用贪心算法写过此题。对于差分约束解决此题的具体过程我们不妨把ai bi看为dis[v[i]]和dis[u[i]],从而转化为图中的点,求解最少的选取点的个数,就是最短路径的问题,满足每个区间至少有Ci个点,设置这个区间权值为Ci,那么dis[v[i]]-dis[u[i]]>=ci,实现了路径压缩。

Codes

#include
#include
using namespace std;const int Inf=-1e6;const int maxn=1e5;int vis[maxn],head[maxn],tot=0,dis[maxn],n,a,b,c,ma=maxn,mb=0;struct edge{
int to,next,w;};edge e[maxn*2];queue
Q;//ci<=bi-ai+1//构造为 -bi<=-(ai-1)+(-ci) void Init(){
//初始化 for(int i=0;i
>n; Init(); for(int i=0;i
>a>>b>>c; add_edge(a,b+1,c);//让a从0开始,实际上是右端点包含 //所以有c<=b-a+1,也可以构造add_edge(a,b+1,c) //dis[b]-dis[a-1]>=c or dis[b+1]-dis[a]>=c ma=min(a,ma); mb=max(b+1,mb); }//0<=dis[i+1]-dis[i]<=1 for(int i=ma;i<=mb;i++){
add_edge(i,i+1,0); add_edge(i+1,i,-1); } spfa(ma); cout<
<

转载地址:http://bdwzi.baihongyu.com/

你可能感兴趣的文章
springSecurity学习
查看>>
通过Java的api操作redis
查看>>
jquery基本选择器
查看>>
linux学习之shell字符串大小写转换
查看>>
Linux下用base64对字符串进行加密解密
查看>>
H5走迷宫小游戏
查看>>
mysql建表 表名与关键字冲突
查看>>
mysql 创建单表外键关联多表
查看>>
postman使用
查看>>
ClassNotFoundException和NoClassDefFoundError的区别
查看>>
Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化
查看>>
spring注解@Primary与@Qualifier
查看>>
annotation之@Autowired、@Inject、@Resource三者区别
查看>>
idea启动微服务找不到配置文件
查看>>
Java通过反射机制调用某个类的方法
查看>>
字节跳到面试题
查看>>
Linux查看物理CPU个数
查看>>
Linux学习之网络IO,磁盘io
查看>>
ES7.6.2安装
查看>>
查看jar依赖树
查看>>