差分约束问题

2024-08-28 16:36
文章标签 问题 差分 约束

本文主要是介绍差分约束问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

差分约束

  • 概念及解法
  • 一些题目

概念及解法

  引用自OI Wiki

差分约束系统是一种特殊的 n 元一次不等式组,它包含 n 个变量 x 1 , x 2 , … , x n x_1,x_2,\dots,x_n x1,x2,,xn 以及 m 个约束条件,每个约束条件是由两个其中的变量做差构成的,形如 x i − x j ≤ c k x_i-x_j\leq c_k xixjck,其中 1 ≤ i , j ≤ n , i ≠ j , 1 ≤ k ≤ m 1 \leq i, j \leq n, i \neq j, 1 \leq k \leq m 1i,jn,i=j,1km 并且 c k c_k ck 是常数(可以是非负数,也可以是负数)。我们要解决的问题是:求一组解 x 1 = a 1 , x 2 = a 2 , … , x n = a n x_1=a_1,x_2=a_2,\dots,x_n=a_n x1=a1,x2=a2,,xn=an,使得所有的约束条件得到满足,否则判断出无解。

差分约束系统中的每个约束条件 x i − x j ≤ c k x_i-x_j\leq c_k xixjck 都可以变形成 x i ≤ x j + c k x_i\leq x_j+c_k xixj+ck,这与单源最短路中的三角形不等式 d i s t [ y ] ≤ d i s t [ x ] + w dist[y]\leq dist[x]+w dist[y]dist[x]+w 非常相似。因此,我们可以把每个变量 x i x_i xi 看做图中的一个结点,对于每个约束条件 x i − x j ≤ c k x_i-x_j\leq c_k xixjck,从结点 j 向结点 i 连一条长度为 c k c_k ck 的有向边。

注意到,如果 { a 1 , a 2 , … , a n } \{a_1,a_2,\dots,a_n\} {a1,a2,,an} 是该差分约束系统的一组解,那么对于任意的常数 d, { a 1 + d , a 2 + d , … , a n + d } \{a_1+d,a_2+d,\dots,a_n+d\} {a1+d,a2+d,,an+d} 显然也是该差分约束系统的一组解,因为这样做差后 d 刚好被消掉。

  一般使用Bellman–Ford / SPFA判断图中是否存在负环,最坏时间复杂度为 O(mn),不存在负环时 { d i s t [ 1 ] , d i s t [ 2 ] , … , d i s t [ n ] } \{dist[1],dist[2],\dots,dist[n]\} {dist[1],dist[2],,dist[n]}就是一组解。

一些题目

  UVa11671 Sign of Matrix
  有一个n*n(2≤n≤100)的全零矩阵,每次可以把某一行的所有元素加1或减1,也可以把某一列的所有元素加1或减1。操作之后每个元素的正负号已知,问:至少需要多少次操作?无解输出-1。例如,要达到下图中的正负号矩阵,至少需要3次操作。
Sign of Matrix
  将行列当成结点,一共2n个结点,根据每个元素的符号建立有向边约束,跑SPFA如果有负圈则无解,否则将数组d排序,把中位数d[n-1]当成0, ∑ i = 0 2 n − 1 a b s ( d [ i ] − d [ n − 1 ] ) \sum_{i=0}^{2n-1} abs( d[i]-d[n-1]) i=02n1abs(d[i]d[n1])就是答案。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;#define N 202
struct {int v, w;} g[N][N>>1]; int c[N], d[N], f[N], cnt[N], q[N*N], n, kase = 0;bool cycle() {int head = 0, tail = n;for (int i=0; i<n; ++i) cnt[i] = d[i] = 0, f[i] = 1, q[i] = i;while (head < tail) {int u = q[head++]; f[u] = 0;for (int i=0; i<c[u]; ++i) {int v = g[u][i].v, d1 = d[u] + g[u][i].w;if (d[v] > d1) {d[v] = d1;if (++cnt[v] >= n) return true;if (!f[v]) q[tail++] = v, f[v] = 1;}}}return false;
}int solve() {memset(c, 0, sizeof(c));for (int i=0; i<n; ++i) for (int j=0; j<n; ++j) {char x; cin >> x;if (x == '+') g[j+n][c[j+n]++] = {i, -1};else if (x == '-') g[i][c[i]++] = {j+n, -1};else g[j+n][c[j+n]++] = {i, 0}, g[i][c[i]++] = {j+n, 0};}n <<= 1;if (cycle()) return -1;sort(d, d+n);int cc = 0, h = (n>>1)-1;for (int i=0; i<n; ++i) cc += abs(d[i]-d[h]);return cc;
}int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);while (cin >> n && n > 0) cout << "Case " << ++kase << ": " << solve() << endl;return 0;
}

  UVa1516/LA5906 Smoking gun
  本题和一般的差分约束不太一样,一般的差分约束不等式带等号,无解等价于有向图存在负权圈,这里差分约束不带等号,那么0权圈也是无解的。可以用Floyd算法处理,有0权圈或负权圈(即w[i][i]≤0)则无解。

这篇关于差分约束问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115304

相关文章

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

idea粘贴空格时显示NBSP的问题及解决方案

《idea粘贴空格时显示NBSP的问题及解决方案》在IDEA中粘贴代码时出现大量空格占位符NBSP,可以通过取消勾选AdvancedSettings中的相应选项来解决... 目录1、背景介绍2、解决办法3、处理完成总结1、背景介绍python在idehttp://www.chinasem.cna粘贴代码,出

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤

java反序列化serialVersionUID不一致问题及解决

《java反序列化serialVersionUID不一致问题及解决》文章主要讨论了在Java中序列化和反序列化过程中遇到的问题,特别是当实体类的`serialVersionUID`发生变化或未设置时,... 目录前言一、序列化、反序列化二、解决方法总结前言serialVersionUID变化后,反序列化失

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关