差分约束系统【模板】

2024-06-15 04:58
文章标签 模板 系统 差分 约束

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

差分约束系统:如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如 xj - xi<= bk ( i , j ∈ [1,n],k ∈ [1,m]),则称其为差分约束系统。
例如如下的约束条件:
X1 - X2 <= 0 X1 - X5 <= -1
X2 - X5 <= 1 X3 - X1 <= 5
X4 - X1 <= 4 X4 - X3 <= -1
X5 - X3 <= -3 X5 - X4 <= -3
全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于)。这样的不等式组就称作差分约束系统。
差分约束系统求解过程:
1.新建一个图,N个变量看作N个顶点,M个约束条件作为M条边。每个顶点Vi分别对于一个未知量,每个有向边对应两个未知量的不等式。
2.为了保证图的连通性,在图中新加一个节点Vs,图中每个节点Vi都能从Vs可达,建立边w(Vs,Vi) = 0。
3.对于每个差分约束Xj - Xi <= Bk(这里是小于等于号),则建立边w(Xi,Xj) = Bk。
4.初始化Dist[] = INF,Dist[Vs] = 0.
5.求解以Vs为源点的单源最短路径,推荐用SPFA,因为一般可能存在负值。
如果图中存在负权回路,则该差分约束系统不存在可行解。
Vs到某点如果不存在最短路径,即最短路为INF,则对于该点表示的变量可以取任意值,都能满足差分约束的要求,如果存在最短路径,则得到该变量的最大值。
上述过程最终得到的解为满足差分约束系统各项的最大值。
注意点:
1. 如果要求最大值想办法把每个不等式变为标准 x - y <= k 的形式,然后建立一条从 y 到 x 权值为 k 的边,变得时候注意 x - y < k => x - y <= k-1。
2. 如果要求最小值的话,变为 x - y >= k 的标准形式,然后建立一条从 y到 x 权值为 k 的边,求出最长路径即可。
3. 如果权值为正,用Dijkstra,SPFA,BellmanFord都可以,如果为负不能用Dijkstra,并且需要判断是否有负环,有的话就不存在。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#define INF 0x7fffffff
using namespace std;
const int MAXN = 1100;
const int MAXM = 30030;struct EdgeNode
{int to;int w;int next;
}Edges[MAXM];int Head[MAXN],Dist[MAXN],vis[MAXN],outque[MAXN],id;void AddEdges(int u,int v,int w)
{Edges[id].to = v;Edges[id].w = w;Edges[id].next = Head[u];Head[u] = id++;
}
void SPFA(int s,int N)
{int ans = 0;memset(vis,0,sizeof(vis));memset(outque,0,sizeof(outque));for(int i = 1; i <= N; ++i)Dist[i] = INF;Dist[s] = 0;vis[s] = 1;queue<int> Q;Q.push(s);while( !Q.empty() ){int u = Q.front();Q.pop();vis[u] = 0;outque[u]++;if(outque[u] > N+1) //如果出队次数大于N,则说明出现负环{ans = -1;break;}for(int i = Head[u]; i != -1; i = Edges[i].next){int temp = Dist[u] + Edges[i].w;if(temp < Dist[Edges[i].to]){Dist[Edges[i].to] = temp;if( !vis[Edges[i].to]){vis[Edges[i].to] = 1;Q.push(Edges[i].to);}}}}if(ans == -1)   //出现负权回路,不存在可行解printf("-1\n");else if(Dist[N] == INF) //可取任意值,都满足差分约束系统printf("-2\n");elseprintf("%d\n",Dist[N]);  //求使得源点 s 到 终点 t 的最大的值
}int main()
{int N,ML,MD,u,v,w;while(~scanf("%d%d%d", &N, &ML, &MD)){memset(Head,-1,sizeof(Head));id = 0;for(int i = 0; i < ML; ++i){scanf("%d%d%d",&u,&v,&w);AddEdges(u,v,w);//建边 u - v <= w}for(int i = 0; i < MD; ++i){scanf("%d%d%d",&u,&v,&w);AddEdges(v,u,-w);//建边 v - u <= w}
//这里不加也可以
//        for(int i = 1; i < N; ++i)
//            AddEdges(i+1,i,0);SPFA(1,N);  //求使得源点 s 到 终点 t 的最大的值}return 0;
}

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



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

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.