差分约束---将不等式转换为图的算法

news2024/11/16 13:47:09

概念:已知一个差分约束系统(差分约束系统即一种特殊的n元一次不等式组),形如x_i-x_j<=c_k,要求求出是否存在一组解使得所有约束条件满足。由于在最短路中dis[y]<=dis[x]+w与该不等式形式相似,因此,可以利用图论,从对应的j点连向i点,并且对应构建出的图,采用bellmanford算法解决带负权负环的问题。

  • 判断解的存在性

  1. 存在负环说明无解;

  2. 不存在由s到t的路径说明s与t之间不存在约束条件

差分约束系统的规范化:

  • 若仅存在<=关系,本质是求解最短路,若仅存在>=关系,本质是求解最长路

  • 如果存在a-b=c的情况则差分约束条件转化为a-b>=c且a-b<=c

  • 如果变量都是整数意义上的,则a-b<c请务必转化为a-b<=c-1,保证约束系统的规范性方便建图

  • 若<=和>=关系同时存在,题干若问两点差值最小,相当于求解x_i-x_j的最小值,此时相当于求解最长路,将差分约束条件转化为>=关系(两边同乘-1)即可;同理,否则求解最短路。

  • 尤其注意不等关系的隐含

差分约束的应用

  1. 线性约束

  • 【模板】差分约束 - 洛谷

思路:这题唯一的不同之处是要求求出可行的一组解,易知任意赋予某个点一个初始的权值,那么可以给与该点相连的其他点赋上’该点权值加上最短边权‘的总和值,但若有些点无法从该点到达则会很别扭,只能赋给它我们初始化的无穷值。因此,不妨建立一个超级源点连接每一条边,既能严谨的判断负环的存在性,也能更好的给出一组解。

  • 有意思的是,如果将超级源点到其他各点的边权设为0,同时超级源点的初始值设为0,则求出的一组解都一定是小于等于0的,因为只有更短的负权路径去更新超级源点到各点的距离,因此求出解非正。而且跟着边权赋值得出一组解的,最终一定都是临界值。若是<=不等式应该是最大值,反之则是最小值

懒得画图详解了,可看算法学习笔记(11): 差分约束

代码实现:

#include<bits/stdc++.h>
#define maxn 10000
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int n,m;
int u[maxn],v[maxn];
ll w[maxn],dis[maxn];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    scanf("%d%d%lld",&v[i],&u[i],&w[i]);
    for(int i=1;i<=n;i++)
    {
        u[i+m]=0;
        v[i+m]=i;
        w[i+m]=1000;//设边权为1000
    }//建立超级源点
    memset(dis,0x3f,sizeof(dis));
    dis[0]=0;
    for(int k=1;k<=n;k++)//因为有n+1个点
    for(int i=1;i<=m+n;i++)
    dis[v[i]]=min(dis[u[i]]+w[i],dis[v[i]]);
    int flag=0;
    for(int i=1;i<=m+n;i++)
    if(dis[v[i]]>dis[u[i]]+w[i])
    flag=1;
    if(flag)
    printf("NO");
    else{
        for(int i=1;i<=n;i++)
        printf("%lld ",dis[i]);//注意,跟着边权赋值,最终一定都是临界值
    }
    system("pause");
}
  1. 区间约束

  • 种树 - 洛谷

  • 思路:利用差分思想,假设d[i]-d[j-1]就是区间上[j,i]种的树的棵数,那么原问题就被转化成了一系列的>=不等式组,构成了差分约束系统。同时还需关注这道题的隐含条件---1>=d[i]-d[i-1]>=0,原因是这是一个整型氛围,需要进行相应的约束。

  • 同时bellman超时,选用spfa大大优化时间复杂度。

#include<bits/stdc++.h>
#include<queue>
#define maxn 100000
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int n,m;
ll tot=0,dis[maxn],head[maxn];
struct Edge{
    int to;
    int next;
    ll w;
}edge[maxn];
void addedge(int u,int v,ll w){
    edge[++tot].to=v;
    edge[tot].next=head[u];
    edge[tot].w=w;
    head[u]=tot;
}
void spfa(void)
{
    ll vis[maxn],s;
    queue<ll>q;
    vis[0]=1;
    q.push(0);
    while(!q.empty())
    {
        s=q.front();
        q.pop();
        vis[s]=0;
        for(ll i=head[s];~i;i=edge[i].next)
        {
            ll to=edge[i].to;
            if(dis[to]>dis[s]+edge[i].w)
            {
                dis[to]=dis[s]+edge[i].w;
                if(!vis[s])vis[to]=1,q.push(to);
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++)
    head[i]=-1;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        ll w;
        scanf("%d%d%lld",&u,&v,&w);
        addedge(u-1,v,-w);
    }//求最长路
    for(int i=1;i<=n;i++)
    {
        addedge(i,i-1,1);
        addedge(i-1,i,0);
    }
    memset(dis,0x3f,sizeof(dis));
    dis[0]=0;
    spfa();
    printf("%lld",-dis[n]);
    system("pause");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133801.html

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

相关文章

探索Web3前沿:革新性算力共享平台,重塑数字资源利用新时代

基于Web3的算力共享平台 随着区块链技术的不断发展和Web3.0时代的到来,算力共享平台逐渐成为推动数字经济和人工智能发展的重要力量。基于Web3的算力共享平台通过去中心化、分布式网络等技术手段,实现了算力的高效、透明和安全的共享,为人工智能、科学研究、艺术创作等多个…

Kamailio-基于Homer与heplify的SIP信令监控-1

接上篇Kamailio监控&#xff0c;对Kamailio的一个基础监控有了一定的概念&#xff0c;但是光看数字如果发现问题&#xff0c;要如何回顾解决呢&#xff1f;生产环境不能随时随地抓包来确定链路的正常与否。 这个时候 Sipcapture 公司推出了Homer这个开源软件&#xff0c;目前G…

【软件测试】常用的开发、测试模型

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【软件测试】常用的开发、测试模型&#xff0c;首先了解, 什么是软件的生命周期, 测试的生命周期, 常见的开发模型: 瀑布, 螺旋, 增量, 迭代, 敏捷. 常用的测试模型, …

银河麒麟桌面系统卸载应用报错快速解决

银河麒麟桌面系统卸载应用报错快速解决 1、问题简述2、解决方案步骤 1: 删除dpkg信息步骤 2: 强制卸载步骤 3: 验证与清理 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、问题简述 在银河麒麟桌面系统中卸载应用时&#xff0c;可能会遇…

AE 让合成重复循环播放

在合成上点右键 > Time > Enable Time Remapping 按住 Alt 键&#xff0c;点秒表图标 输入 loop_out("cycle", 0) 将子合成拖到此合成结束的位置 结束

Linux 上自动下载 Docker 依赖并离线安装的完整指南

Linux 上自动下载 Docker 依赖并离线安装的完整指南 文章目录 Linux 上自动下载 Docker 依赖并离线安装的完整指南一 添加软件源二 更新 yum 缓存三 下载依赖四 打包 rpm 文件五 离线安装 这篇指南详细讲解了如何在CentOS 7.9系统上&#xff0c;通过 yum命令自动下载Docker的所…

vue3使用leaflet+trackplayer实现非地图动画轨迹(市场平面图动态轨迹)

vue3使用leaflettrackplayer实现非地图动画轨迹(市场平面图动态轨迹) 先下载 leaflet 和 leaflet-trackplayer两个主要库 leaflet官方文档 npm install leaflet npm install leaflet-trackplayer然后在页面中引用 html <template><button click"playMap&quo…

LLM - 理解 多模态大语言模型 (MLLM) 的指令微调与相关技术 (四)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142063880 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…

第 12 篇 Helm 部署 Redis

文章目录 Redis Chart部署 Redis 单机版部署 Redis 哨兵版第 1 步&#xff1a;准备 values.yaml 配置文件第 2 步&#xff1a;安装 bitnami/redis第 3 步&#xff1a;解决 Pod Pending 问题查看 Pod 状态添加 PV 持久化卷创建 pv1创建 pv2创建 pv3 查看 Pod 状态 第 4 步&#…

java实际开发——数据库存储金额时用什么数据类型?(MySQL、PostgreSQL)

目录 java开发时金额用的数据类型——BigDecimal MySQL存储金额数据时用的数据类型是——decimal PostgreSQL存储金额数据时用的数据类型是——decimal 或 money java开发时金额用的数据类型——BigDecimal https://blog.csdn.net/Jilit_jilit/article/details/142180903?…

传统Malmquist-Luenberger指数与全局Malmquist-Luenberger指数的区别

1.全局技术前沿的构建 1.1传统ML指数 技术前沿的时间依赖性 传统的Malmquist-Luenberger&#xff08;ML&#xff09;指数在每个时期&#xff08;例如年份&#xff09;单独构建各自的技术前沿。这意味着每个时期的生产可能性集合和技术效率都是基于该时期的数据。 不可比性问…

【包教包会】CocosCreator3.xSprite和Label渐变色(支持3.x、支持原生、可合批)

完美适配Web、原生平台&#xff08;其余平台没测过&#xff09;。 下载地址&#xff1a;水煮肉片饭/Palette3.x 如何导入自己项目&#xff1a; 1、将Demo中Palette.ts复制到自己项目assets目录下 2、新建一个Sprite或Label节点&#xff0c;将Palette组件挂上去 3、设置顶点…

openstack之glance介绍

概念 glance为nova提供镜像服务&#xff0c;用于启动实例&#xff0c;预建镜像已安装cloud-init&#xff0c;可以访问openstack基金会获取操作系统镜像&#xff1a;官方镜像 格式 raw&#xff1a;无格式的镜像&#xff1b; vhd&#xff1a;hyper-v使用的格式&#xff1b; vm…

arcgisPro地理配准

1、添加图像 2、在【影像】选项卡中&#xff0c;点击【地理配准】 3、 点击添加控制点 4、选择影像左上角格点&#xff0c;然后右击填入目标点的投影坐标 5、依次输入四个格角点的坐标 6、点击【变换】按钮&#xff0c;选择【一阶多项式&#xff08;仿射&#xff09;】变换 7…

数据结构(7.3_1)——二叉排序树

二叉排序树&#xff0c;又称二叉查找树(BST,Binary Search Tree) 一棵二叉树或者是空二叉树&#xff0c;或者是具有如下性质的二叉树&#xff1a; 左子树上所有结点的关键字均小于根结点的关键字&#xff1b;右子树上所有结点的关键字均大于根结点的关键字&#xff1b;左子树…

系统优化工具 | PC Cleaner v9.7.0.3 绿色版

PC Cleaner是一款功能强大的电脑清理和优化工具&#xff0c;旨在通过清理系统垃圾文件、解除恶意软件和优化系统性能来提高计算机的运行效率。该软件提供了多种功能&#xff0c;可以帮助用户维护和提升计算机的整体表现。 PC Cleaner 支持 Windows 7 及以上操作系统&#xff0…

餐饮+KTV点歌一体化思路-—SAAS本地化及未来之窗行业应用跨平台架构

一、餐饮KTV点歌一体化 1. 多元化体验&#xff1a;为顾客提供了餐饮和娱乐的双重享受&#xff0c;满足了不同需求&#xff0c;增加了顾客的停留时间和消费可能性。 2. 增加消费机会&#xff1a;顾客在享受美食的同时可以唱歌娱乐&#xff0c;可能会增加酒水、小吃等额外消费。…

【我的 PWN 学习手札】Unlink Attack

目录 前言 一、Unlink介绍 二、保护和限制 &#xff08;1&#xff09;FD->bk P AND BK->fd P &#xff08;2&#xff09;chunksize(P) prev_size(next_chunk(P)) &#xff08;3&#xff09;largebin chunk 三、适用场景 四、利用与绕过 &#xff08;1&#…

Day 11-12:查找

目录 概念 方法 折半查找 前提 算法思路 分块查找 算法思路 哈希表 概念 构造哈希函数的方法 保留除数法 处理冲突的方法 开放地址法&#xff08;二次探查法&#xff09; 链地址法&#xff08;重要&#xff09; 哈希表的实现 结构体的创建 哈希表的创建 哈希…

Agent实战——使用 Dify 和 Moonshot API 构建 AI 工作流

引言 在当今的大模型应用浪潮中&#xff0c;AI Agent的开发和集成已经成为技术革新的重要方向。随着大模型的不断进步&#xff0c;如何利用这些强大的模型来简化复杂的任务&#xff0c;并将其集成到企业的生产环境中&#xff0c;成为开发者和企业共同关注的焦点。在2024年稀土…