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

差分约束系统

时间:2024-11-26 19:00:36浏览次数:7  
标签:连边 geq 不等式 int sum 系统 差分 约束 dis

差分约束

给出\(n\)个活动,设\(t_i\)表示第\(i\)个活动开始的时间。这些活动满足以下\(m\)个类似关系:

\[\begin{cases} t_{i1}-t_{j1}<=B_1 \\ t_{i2}-t_{j2}<=B_2 \\ \dots \\t_{im}-t_{jm}<=B_m \end{cases} \]

其中\(1 <= i_1,i_2,\dots, i_m,j_1,j_2,\dots, j_m<=n\)
求满足这m个不等式的解。

这些活动的约束条件全部为两个活动的开始时间的差值不等式,称这样的问题为差分约束系统。

差分约束系统可以转化为图论的最短路问题。

首先,我们回顾一下,dijkstra算法过程中,有一个松弛不等式。
如果图中存在一条边\((u, v)\), 其边权为\(w\)。

如果存在下列不等式:

\(dis[u] + w < dis[v]\)

则说明\(dis[v]\)能够被更新。

而如果已经求完了最短路,则边\((u,v)\)不能再松弛。
即此时有:
\(dis[u] + w >= dis[v]\)

每条边都会有类似的不等式。如果将每条边的这个不等式联立起来,就可以得到一个不等式方程组。

如果把求完了最短路之后,每个点的dis值,都一定能满足这个不等式方程组。于是我们就可以通过最短路来得到这个不等式方程组的解。

回到最开始的不等式方程组,

\[\begin{cases} t_{i1}-t_{j1}<=B_1 \\ t_{i2}-t_{j2}<=B_2 \\ \dots \\t_{im}-t_{jm}<=B_m \end{cases} \]

可以转换为:

\[\begin{cases} t_{j1} + B_1 \geq t_{i1} \\ t_{j2} + B_2 \geq t_{i2} \\ \dots \\t_{jm} + B_m \geq t_{im} \end{cases} \]

将\(t\)数组当做\(dis\)数组,\(i1,j1,i2,j2,\dots, im,jm\) 看做点。
对于第一个不等式\(t_{j1} + B_1 \geq t_{i1}\) ,\(j1\)向\(i1\)连边,边权为\(B_1\).
其他不等式类似去连。

举几个例子:

  • \(t_i - t_j \leq B1\)
  • \(t_i - t_j \leq -B1\)
  • \(t_i - t_j \geq B1\)
  • \(t_i - t_j \geq -B1\)

对应的连边分别为:

  • \(j\)向\(i\)连边,边权为\(B1\)
  • \(j\)向\(i\)连边,边权为\(-B1\)
  • \(i\)向\(j\)连边,边权为\(-B1\)
  • \(i\)向\(j\)连边,边权为\(B1\).

还有可能遇到这样的不等式,\(t_i - t_j \lt B_1\),此处\(B_1\)为整数。
我们可以将它变成\(t_i - t_j \leq B_1 - 1\), 然后\(j\)向\(i\)连边,边权为\(B_1 - 1\)。

注意:

  • 差分约束转换为最短路后,只要最短路有解,则意味着不等式组有无穷多组解。我们一般都会将dis[s]固定为\(0\),从而得到一组固定的解。
  • \(dis[i]\)在图论中是最短距离,但是在原不等式方程组的意义却是最大值,而不是最小值。

例题1:奇怪的数列

题目描述

给出\(3\)个整数\(n,p,q\),寻找\(1\)个由整数组成的数列\((a_1,a_2,\dots,a_n)\),要求:其中任意连续\(p\)项之和为正数,任意连续\(q\)项之和为负数。 若不存在这样的数列,则输出NO;否则输出满足条件的一个数列即可。

数据范围

\(0<n<100,0<p,q<n\)

分析

对数列求前缀和,sum(k)表示前k个数的和。
这样得到sum(0),sum(1),……sum(n).
根据题意,
sum(k)<sum(k+p)
sum(k)>sum(k+q)
把每一个sum值作为一个顶点,若sum(i)>sum(j),则连一条i指向j的有向边。这样得到一个有向图。若图可以拓扑排序,则有解,否则无解。
若有解,则给sum(0)赋值0,然后按照有向边给其他各点依次赋值,最后求出数列。

比如n=6,p=5,q=3,设sum(k)为前k项之和。
得到如下关系式,
sum0<sum5
Sum1sum3
Sum1>sum4
Sum2>sum5
Sum3>sum6
该图可以进行拓扑排序。
分别为
Sum2,sum5,sum0,sum3,sum6,sum1,sum4
于是令其分别为
2,1,0,-1,-2,-3,-4
推出数列
为-3,5,-3,-3,5,-3

例题2 01序列

题目描述

考虑一个长度为\(N\)由01组成的序列,\(A=(A_1,A_2,\dots,A_n)\),满足下列的\(M\)个条件:
每个条件形如:L R X,表示序列的区间\([L,R]\)中至少有\(X\)个1。
输出满足条件的且包含最少的1的序列。如果有多个满足要求的序列,输出字典序最小的序列。

保证 \(1 \leq X_i \leq R_i -L_i + 1\),可以证明这样的序列一定存在。

分析

用\(dis_i\)表示前\(i\)个数的前缀和,则一个条件\((i,j,k)\),表示\(dis[j]-dis[i-1] >= k\), 则点\(i-1\)向\(j\)连一条边,权值为\(k\).

除此之外,因为\(dis[i - 1] + 1 \geq dis[i] \geq dis[i - 1]\),所以还要从点\(i\)到点\(i-1\)连一条长度为\(0\)的边,从\(i-1\)向\(i\)连一条长度为\(0\)的边。

然后从源点\(0\)开始求最短路。这样求出来的\(dis_i\), 虽然能满足题目不等式,但是它的意义却是包含\(1\)最多的,显然这不符合题意。

我们可以换一个角度,设\(dis_i\)表示前\(i\)个数中包含的\(0\)的个数。
则原条件\((i,j,k)\), 现在的意义应该是\(dis[j] - dis[i-1] <= (j - i + 1 - k)\),连边也变成了\(i - 1\)向\(j\)连边,边权为\(j - i + 1 - k\). 边权不可能为负。

同时,因为有\(dis[i - 1] \leq dis[i] \leq dis[i - 1] + 1\), 所以,\(i\)向\(i-1\)连边权为\(0\)的边,\(i-1\)向\(i\)连边权为\(1\)的边。

这样,从\(0\)点出发跑dijkstra,可以求出dis数组,从而确定每一个位置的数字是\(0\)还是\(1\)了。

#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
int dis[maxn], ans[maxn];
bool inq[maxn];
struct edge{
    int v, w, nxt;
}es[maxn << 2];

struct node{
    int v, dis;
    node(int a = 0, int b = 0){ 
        v = a, dis = b;
    }
    bool operator < (const node &t)const {
        return dis > t.dis;
    }
};

priority_queue<node> myq;

int n, m, ecnt;
int fir[maxn];
void adde(int a, int b, int c){
    es[++ecnt].v = b, es[ecnt].w = c, es[ecnt].nxt = fir[a], fir[a] = ecnt;
}


void dijkstra(int s){
    dis[s] = 0;
    myq.push(node(s, 0));
    inq[s] = 1;
    while(!myq.empty()){
        s = myq.top().v;
        myq.pop();
        if(inq[s] == 0) continue;
        inq[s] = 0;
        for(int i = fir[s]; i; i = es[i].nxt){
            int v = es[i].v;
            if(dis[v] > dis[s] + es[i].w) {
                dis[v] = dis[s] + es[i].w;
                myq.push(node(v, dis[v]));
                inq[v] = 1;
            }
        }
    }
}

int main(){
    int a, b, c;
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; i++){
        scanf("%d %d %d", &a, &b, &c);
        adde(a - 1, b, b - (a - 1) - c);
    }
    for(int i = 1; i <= n; i++){
        adde(i, i - 1, 0);
    }
    for(int i = 1; i <= n; i++) adde(i - 1, i, 1);
    memset(dis, 0x3f, sizeof dis);
    dijkstra(0);
    for(int i = 1; i <= n; i++){
        if(dis[i] - dis[i - 1] == 1) printf("0 ");
        else printf("1 ");
    }
    return 0;
}

标签:连边,geq,不等式,int,sum,系统,差分,约束,dis
From: https://www.cnblogs.com/hefenghhhh/p/18570791

相关文章

  • node.js毕设摄影服务管理系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于摄影服务管理系统的研究,现有研究主要集中在摄影技术、摄影艺术等方面,专门针对摄影服务管理系统的研究较少。在摄影行业蓬勃发展的当下,摄影服务的管......
  • node.js毕设摄影跟拍预定管理系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于摄影跟拍预定管理系统的研究,现有研究多以摄影业务流程的部分环节优化为主,专门针对摄影跟拍预定管理系统整体功能架构的研究较少。在国内外,摄影行业......
  • 从零开始:苹果手机免越狱群控系统的快速入门指南
    对于初次接触苹果手机免越狱群控系统的用户来说,可能会感到有些困惑和不知所措。本章将提供一个详细的快速入门指南,帮助你从零开始,轻松掌握如何设置和使用这项强大的技术。免越狱群控系统概述苹果手机免越狱群控系统是一种通过合法合规的技术手段,在不破坏iOS系统安全性的前提......
  • 揭秘系统架构师的电脑桌面:隐藏的工作秘密大公开!
    文章目录一、前言二、Windows相关三、编辑器相关四、云开发相关4.1IDE4.2工具五、工具相关六、嵌入式相关七、美工相关八、产品相关九、其他一、前言总有同事和妹子想看我的电脑桌面,看看我装了哪些软件。今天就满足你,花了不少时间整理一下(#.#)二、Windows......
  • 基于springboot+vue的牙科诊所管理系统(全套)
    一、系统架构           前端:vue|element-ui|html           后端:springboot|mybatis-plus           环境:jdk1.8+|mysql|maven|nodejs二、代码及数据库三、功能介绍   01.web端-首页1   02.web端-首......
  • 半小时,做出一整套扫码出入库系统
    出入库管理在很多企业中都是至关重要的环节。那大家有没有想过,我们日常工作中的出入库管理方式是不是真的高效呢?可能传统的方式可能会耗费大量的人力和时间,还容易出错。而现在,随着科技的发展,扫码出入库系统逐渐成为了一种高效的解决方案。我看到很多人都在分享自己制作扫码出入库......
  • 代购系统:连接全球好物,便捷生活新选择
    引言在这个全球化的时代,人们对于商品的需求越来越多样化和个性化。代购系统作为一种新兴的商业模式,以其独特的优势满足了消费者对全球商品的需求,同时也为代购者提供了一个灵活的创业平台。本文将深入探讨代购系统的概念、优势、运作模式以及未来发展趋势,为您揭开代购系统的神......
  • 未来代购系统会面临哪些挑战?
    未来代购系统在发展过程中将面临以下挑战:法律法规合规性:由于涉及跨境贸易,代购系统需要严格遵守国内外的相关法律法规,如海关规定、税收政策等。系统运营者应加强法律意识,及时了解政策动态,并确保业务的合规性。市场竞争加剧:随着代购市场的不断发展,竞争日益激烈。代购系统需要......
  • SAP B1 系统-主窗口和定制工具的笔记
    文章目录前言一、SAPB1主窗口1.菜单栏2.工具栏3.主菜单4.状态栏5.上下文菜单6.搜索引擎二、SAPB1定制工具1.用户自定义的字段举例1:在物料主数据添加自定义字段“收货提前期”,字段头衔为“U_DeliveryLeadTime”,字段类型为“数字”2.用户自定义的值举例1:将销售订单的......
  • php毕业设计购物商城在线购物系统日用品购物商城手工艺系统日用品系统手工艺网站php+m
    一,功能介绍        前台主要包括网站首页、商品推荐、最新商品、新闻咨询、商品分类、商品资讯、评论、登录、注册、加入购物车、结算、个人中心等功能模块商品推荐、最新商品在商品推荐、最新商品模块,用户可以查看全部商品信息,选择商品进行添加购物车等操作,购物......