差分约束问题

news2024/9/20 8:47:06

差分约束

  • 概念及解法
  • 一些题目

概念及解法

  引用自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.coloradmin.cn/o/2083375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网安装GitLab

内网安装GitLab 为什么安装GitLab GitHub&#xff08;国外&#xff09;和Gitee&#xff08;国内&#xff09;都是第三方托管平台&#xff0c;不能本地部署&#xff0c;对公网开放&#xff0c;代码保密性不高。 为代码保密性&#xff0c;需在内网搭建代码管理平台。有web操作…

Java设计模式之建造者模式详细讲解和案例示范

引言 在软件开发中&#xff0c;创建复杂对象常常伴随着众多参数和配置&#xff0c;这种情况容易导致“构造函数爆炸”或参数混乱的问题。为了解决这一问题&#xff0c;建造者模式&#xff08;Builder Pattern&#xff09;应运而生。它通过分步骤地构建对象&#xff0c;提供了更…

C++编程:高阶编程

本阶段主要针对泛型编程和STL技术作详细讲解。 1 模板 1.1 模板的概念 C提供一种泛型编程&#xff0c;主要利用模板的技术&#xff0c;模板的目的是提高代码复用性&#xff0c;将类型参数化。 C提供两种模板机制&#xff1a; 函数模板类模板 模板的特点&#xff1a; 模板…

实习结束总结20240828

长达两个月的实习终于在今天结束了&#xff0c;不知怎的&#xff0c;心如止水&#xff0c;没有高兴&#xff0c;没有伤心&#xff0c;毫无波澜的内心甚至让自己都感觉可怕&#xff0c;也许&#xff0c;这就是成长吧。 硬件上&#xff1a; 1.cadence需要继续深入学习&#xff…

Transformers for One-Shot Visual Imitation

发表时间&#xff1a;(CoRL 2020&#xff09; 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId4546337571360890881&noteId2424798489658874880 作者单位&#xff1a;Carnegie Mellon University, USA Motivation&#xff1a;人类能够通过推断他们…

每日OJ_牛客_年会抽奖(错排问题)

牛客_年会抽奖&#xff08;错排问题&#xff09; 年会抽奖__牛客网 解析代码 该题为经典的错排问题 用A、B、C……表示写着&#xff4e;位友人名字的信封&#xff0c;a、b、c……表示&#xff4e;份相应的写好的信纸。把错装的总数为记作 D(n)。假设把&#xff41;错装进&…

【ubuntu使用笔记】Ubuntu Desktop 访问SMB共享文件夹

Ubuntu Desktop 访问SMB共享文件夹 Ubuntu Desktop 访问SMB共享文件夹文件夹打开 file managerother location输入 IP地址&#xff0c;smb://IP点击connect按钮正常进入 命令行安装客户端连接 Ubuntu Desktop 访问SMB共享文件夹 文件夹 打开 file manager other location 输入…

WATCH, TRY, LEARN: META-LEARNING FROM DEMONSTRATIONS AND REWARDS

&#xff08;感觉有点从失败中学习的意思&#xff09; 发表时间&#xff1a;30 Jan 2020 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId4545005537963171841&noteId2453371997770644736 作者单位&#xff1a;UC Berkeley Motivation&#xff1a…

2024年高教社杯全国大学生数学建模竞赛

2024年高教社杯全国大学生数学建模竞赛通知 2024数模比赛确定时间为&#xff1a;9月5日18时至9月8日20时 报名截止日期&#xff1a;9月2日&#xff08;周一&#xff09;20时

使用maven 实现版本覆盖案例4【经典版】

一 原理介绍 1.1 原理逻辑 关系图&#xff1a;从使用方xinxiang_demo中引用A_parent的2.13的版本的层级要比B_Module继承A_parent&#xff1a;1.1 版本的层级要短&#xff0c;优先级更高&#xff0c;所以使用2.13&#xff0c;将B_Module继承A_parent 1.1 版本覆盖。 1.2 实操…

约 数个数

对于一个数 其中&#xff1a;是的各个质因数&#xff0c;上式是的质因数乘积式。 约数个数&#xff1a; 约数之和&#xff1a; step1&#xff1a; 采用分解质因数的方法&#xff0c;计算出的每一个质因数的次数 &#xff08;分解质因数的blog&#xff1a;http://t.csdni…

Kali学习(ms17-010、ms08-067漏洞复现)

目录 一、kali网络设置 NAT模式、桥接上网/仅主机 VMnet0、VMnet1、VMnet8 1.NAT模式 VMnet8 &#xff08;1&#xff09;检查服务 &#xff08;2&#xff09;创建虚拟网卡 &#xff08;3&#xff09;创建kali的网卡信息 &#xff08;4&#xff09;验证 2.桥接模式 VMn…

结果一。5.be doing表将来和 表 will的区别

be doing 表⽰近期、眼下就要发⽣的事情; will 表⽰将来的时间,则较远⼀些。如: He is going to write a letter tonight.He will write a book 。 be going to 表⽰根据主观判断将来肯定发⽣的事情。 will+ 动词原形表⽰⼀般将来时。 will ࿰

如何用Java SpringBoot+Vue打造高效产品订单管理系统?

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

【C++ Primer Plus习题】6.9

问题: 解答: #include <iostream> #include <string> #include <fstream> using namespace std;typedef struct _Donor {string name;double money; }Donor;int main() {ifstream file;string filename;int count 0;cout << "请输入文件名:&quo…

PDF合并可以如此简单?!这3种方法,简单又实用!

在日常的忙碌与学习中&#xff0c;我们时常需要将散落的PDF文件整合成一份完整的文档&#xff0c;无论是为了整理报告、汇编学习资料&#xff0c;还是为了提升阅读效率&#xff0c;PDF合并都显得尤为重要。 今天&#xff0c;就让我带你解锁三种既简单又高效的PDF合并方法&#…

进程终止 等待 替换

文章目录 一.进程的终止进程终止实在做什么&#xff1f;进程终止的3种情况自定义退出码 如何终止进程&#xff1f; 二.进程等待为什么要进行进程等待&#xff1f;进程如何等待&#xff1f;waitwaitpid 阻塞等待 && 非阻塞等待 三.进程的程序替换先看代码 && 现…

Windows电脑还在纠结用什么便签软件?

在快节奏的生活中&#xff0c;我们常常需要记录下一些重要的事情或者临时的想法&#xff0c;而便签软件就是我们的好帮手。但是&#xff0c;面对市面上众多的便签软件&#xff0c;Windows电脑用户可能会感到困惑&#xff0c;不知道该如何选择。在这里&#xff0c;小编为你提供一…

Great Wall长城工作站安装银河麒麟V10(SP1)-ARM版桌面操作系统

长城工作站安装银河麒麟V10(SP1)桌面操作系统 1. 硬件信息 [1]. Great Wall 长城台式微型计算机 产品型号&#xff1a;世恒TD120A2 型号代码&#xff1a;世恒TD120A2-019 电源&#xff1a;220V~3A 50Hz [2]. 芯片型号 架构&#xff1a; aarch64 CPU 运行模式&#xff1a…

【Qt窗口】—— 浮动窗口

目录 1.1 浮动窗口的创建 1.2 设置停靠的位置 1.3 示例小结 在Qt中&#xff0c;浮动窗口也称之为铆接部件&#xff0c;俗称为子窗口&#xff0c;浮动窗口是通过QDockWidget类来实现浮动的功能。浮动窗口⼀般是位于核⼼部件的周围&#xff0c;可以有多个。 1.1 浮动窗口的…